Найти - Пользователи
Полная версия: SQLAlchemy: create_engine, pool, постоянное соединение
Начало » Базы данных » SQLAlchemy: create_engine, pool, постоянное соединение
1 2
axe
пробовал установить постоянное соединение с БД по http://www.modpython.org/FAQ/faqw.py?req=show&file=faq03.003.htp
тут постоянные соединения создаются с помощью sqlalchemy.pool и MySQLdb.connect. пример проверил - работает.

нужно установить постоянное соединение с MySQL с помощью sqlalchemy.create_engine
в связи с этим пробую разобраться по http://www.sqlalchemy.org/docs/05/dbengine.html#dbengine_options

правильно ли понимаю, что либо мы указываем готовый объект pool,
либо указываем poolclass и набор параметров класса для создания объекта?

исходя из http://www.sqlalchemy.org/docs/05/sqlalchemy_pool.html получается, что мне нужен QueuePool.
Это класс, который поддерживает ограниченное число открытых соединений.

для QueuePool непонятно:
def __init__(self, creator, pool_size=5, max_overflow=10, timeout=30, **params)
creator - это объект какого класса?
Андрей Светлов
The main argument, `creator`, is a callable function that returns
a newly connected DB-API connection object.
axe
определяю функцию, которая должна вернуть connected DB-API connection object:
def conn1():
import MySQLdb as mysql
a = mysql.connect( db="dbname", user="axe", host="localhost" )
return a
создаю объект и передаю ему функцию в качестве параметра:
l_pool = sqlalchemy.pool.QueuePool( conn1 )

и пробую создать engine:
db = create_engine( l_DBSettings, pool=l_pool)

получаю ошибку:
‘module’ object has no attribute ‘DBProxy’
Андрей Светлов
Честно говоря, по примеру мало что понятно.
Я бы делал все-таки через poolclass.
И, кстати, QueuePool - вариант “по умолчанию”, умеющий раздуваться/сжиматься.
И еще. Насколько я помню, для MySQL использование recycle для постоянных соединение - обязательная штука.
axe
пробую подключиться так:
        db = create_engine( l_DBSettings, 
poolclass=sqlalchemy.pool.QueuePool,
max_overflow=10,
pool_size=5,
pool_recycle = 1000,
pool_timeout=30
)
некоторые соединения остаются открытыми, некоторые закрываются почти сразу.
повторно не одно из соединений не используется.

Андрей Светлов
QueuePool - вариант “по умолчанию”, умеющий раздуваться/сжиматься.
что значит ‘раздуваться/сжиматься’ ?
bw
axe
некоторые соединения остаются открытыми, некоторые закрываются почти сразу.
повторно не одно из соединений не используется.
Как ты это определяешь?

..bw
axe
смотрю в Менеджере сессий в dbForge Studio
хорошая прога, кстати. бесплатна для некоммерческого использования
Андрей Светлов
axe
пробую подключиться так:
        db = create_engine( l_DBSettings, 
poolclass=sqlalchemy.pool.QueuePool,
max_overflow=10,
pool_size=5,
pool_recycle = 1000,
pool_timeout=30
)
некоторые соединения остаются открытыми, некоторые закрываются почти сразу.
повторно не одно из соединений не используется.
При таких настройках система ведет себя так:
- пересоздает соединения каждые 16 мин.
- хранит очередь размером в 5 соединений
- если нужно соединение - пытается взять его из очереди. При этом ждет до 30 сек.
- если в очереди ничего нет - создает новое. Если лимит overflow превышен - бросает исключение.
- когда соединение уже не нужно - оно возвращается в очередь. Если очередь уже полная (содержит 5 соединений) - выбрасывается.

Таким образом можно легко загрузить систему, чтобы в очередь попадали всегда свежесозданные соединения.
Для твоего случая нужно увеличить pool_size до 10 (хочется иметь 10 открытых соединений, как я помню), и поставить pool_timeout на несколько минут - чтобы хватило времени на обработку запроса и соедиение успело возвратиться в очередь. max_overflow стоит оставить на всякий случай - исключение может быть весьма неприятной неожиданностью, если на него изначально не закладываешься по подобию ‘Service is not available’.
axe
пока ничего не получается :)

обратил внимание, что соединения с базой исчезают при перезагрузке apache
видимо, подключения хранятся в mod_python?

попробовал сделать консольное приложение работающее с базой.
соединения этого приложения в менеджере сессий не отображаются
(т.е. они сразу закрываются по завершению работы программы)
Андрей Светлов
закрываются, конечно же :)
А как иначе? Если клиентский процесс закончен - все нужно завершить, файлы и соединения - закрыть.
Зачем apache перезагружать постоянно? Я наивно думал, что это - “вечно” живущий демон :)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB