Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 8, 2008 09:20:44

axe
От:
Зарегистрирован: 2008-08-07
Сообщения: 256
Репутация: +  0  -
Профиль   Отправить e-mail  

SQLAlchemy: create_engine, pool, постоянное соединение

пробовал установить постоянное соединение с БД по 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 - это объект какого класса?



Офлайн

#2 Сен. 8, 2008 13:37:39

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

SQLAlchemy: create_engine, pool, постоянное соединение

The main argument, `creator`, is a callable function that returns
a newly connected DB-API connection object.



Офлайн

#3 Сен. 8, 2008 14:57:34

axe
От:
Зарегистрирован: 2008-08-07
Сообщения: 256
Репутация: +  0  -
Профиль   Отправить e-mail  

SQLAlchemy: create_engine, pool, постоянное соединение

определяю функцию, которая должна вернуть 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’



Отредактировано (Сен. 8, 2008 14:58:13)

Офлайн

#4 Сен. 8, 2008 15:20:44

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

SQLAlchemy: create_engine, pool, постоянное соединение

Честно говоря, по примеру мало что понятно.
Я бы делал все-таки через poolclass.
И, кстати, QueuePool - вариант “по умолчанию”, умеющий раздуваться/сжиматься.
И еще. Насколько я помню, для MySQL использование recycle для постоянных соединение - обязательная штука.



Офлайн

#5 Сен. 8, 2008 16:11:56

axe
От:
Зарегистрирован: 2008-08-07
Сообщения: 256
Репутация: +  0  -
Профиль   Отправить e-mail  

SQLAlchemy: create_engine, pool, постоянное соединение

пробую подключиться так:

        db = create_engine( l_DBSettings, 
poolclass=sqlalchemy.pool.QueuePool,
max_overflow=10,
pool_size=5,
pool_recycle = 1000,
pool_timeout=30
)
некоторые соединения остаются открытыми, некоторые закрываются почти сразу.
повторно не одно из соединений не используется.

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



Офлайн

#6 Сен. 9, 2008 07:33:54

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

SQLAlchemy: create_engine, pool, постоянное соединение

axe
некоторые соединения остаются открытыми, некоторые закрываются почти сразу.
повторно не одно из соединений не используется.
Как ты это определяешь?

..bw



Офлайн

#7 Сен. 9, 2008 10:13:27

axe
От:
Зарегистрирован: 2008-08-07
Сообщения: 256
Репутация: +  0  -
Профиль   Отправить e-mail  

SQLAlchemy: create_engine, pool, постоянное соединение

смотрю в Менеджере сессий в dbForge Studio
хорошая прога, кстати. бесплатна для некоммерческого использования



Офлайн

#8 Сен. 9, 2008 12:27:37

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

SQLAlchemy: create_engine, pool, постоянное соединение

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’.



Офлайн

#9 Сен. 9, 2008 15:03:07

axe
От:
Зарегистрирован: 2008-08-07
Сообщения: 256
Репутация: +  0  -
Профиль   Отправить e-mail  

SQLAlchemy: create_engine, pool, постоянное соединение

пока ничего не получается :)

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

попробовал сделать консольное приложение работающее с базой.
соединения этого приложения в менеджере сессий не отображаются
(т.е. они сразу закрываются по завершению работы программы)



Офлайн

#10 Сен. 9, 2008 15:28:15

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

SQLAlchemy: create_engine, pool, постоянное соединение

закрываются, конечно же :)
А как иначе? Если клиентский процесс закончен - все нужно завершить, файлы и соединения - закрыть.
Зачем apache перезагружать постоянно? Я наивно думал, что это - “вечно” живущий демон :)



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version