Не удается увидеть движок SQLAlchemy с настройками пула по умолчанию, устанавливающими более одного подключения за раз - PullRequest
0 голосов
/ 01 февраля 2019

Мне нужна помощь в понимании пула соединений с точки зрения SQLAlchemy и с точки зрения Redshift.

В конечном итоге я хочу достичь:

  • Максимизировать параллелизм запросов, но сохранить Redshift от исчерпания соединений
  • Избегайте узких мест в пуле соединений, пока Redshift работает действительно хорошо, но у приложения Python недостаточно соединений, и запросы начинают формировать большую очередь

У меня есть несколько экземпляров приложения, запущенного в докереконтейнеры, каждый экземпляр создает свой собственный объект SQLAlchemy Engine с настройками пула по умолчанию.

engine = create_engine(REDSHIFT_URI, echo=True, echo_pool=True)

Я также использую модель управления контекстом, предложенную в документации SQLAlchemy, и выполняю каждый запрос в этом контексте.Все мои запросы являются запросами на агрегацию.

@contextmanager
def session_scope():
    session = Session(engine)
    try:
        yield session
        session.commit()
    except:
        session.rollback()
        raise
    finally:
        session.close()

Я считаю все сеансы Redshift с select count(*) from stv_sessions where user_name != ‘rdsdb’.Количество сессий совпадает с количеством контейнеров приложений.

Затем я начинаю запускать тонны запросов из приложения. Я не вижу увеличения количества сеансов Redshift.Также я не вижу никаких сообщений от регистрации пула SQLAlchemy.

Из документации Redshift:

Каждый сеанс соответствует соединению.Вы можете просмотреть информацию об активных пользовательских сессиях для Amazon Redshift или проверить общее количество соединений с помощью STV_SESSIONS.

Насколько я понимаю, SQLAlchemy должен открыть 5 соединений, но я не вижуэто ни в Redshift, ни в журналах приложений.SQLAlchemy просто постоянно использует одно соединение?Разве определение соединения SQLAlchemy отличается от определения в Redshift?

Где поток в моей логике?Похоже, либо мое тестирование прошло плохо, либо я не понял одну из концепций.

1 Ответ

0 голосов
/ 02 февраля 2019

https://docs.sqlalchemy.org/en/latest/core/pooling.html

Создать Pool

import sqlalchemy.pool as pool
import psycopg2

def getconn():
    c = psycopg2.connect(username='ed', host='127.0.0.1', dbname='test')
    return c

mypool = pool.QueuePool(getconn, max_overflow=10, pool_size=5)
e = create_engine('postgresql://', pool=mypool)
...