niro
Авг. 2, 2007 19:25:29
Вот обнаружилась странная вещь - при работе через sqlalchemy появляются sleep-процессы в списке процессов mysql. Если работать через mysqldb их не возникает, даже если их не закрывать коннекты. Возможно я неправильно делаю соединяюсь через sqlalchemy. Обычно пишу так, вроде по туториалу:
db = create_engine('mysql://root@localhost/somebase').connect()
posts = Table('posts', db, autoload = True)
users = Table('users', db, autoload = True)
forum_sub = Table('forum_sub', db, autoload = True)
….
db.close()
Андрей Светлов
Авг. 2, 2007 20:28:28
Как я понимаю, ты пытаешься пересоздавать схему постоянно.
Так в алхимии, вообще-то, не принято.
Создаешь metadata (он же db) один раз за время жизни программы. Вполне подходит переменная модуля. Тут же описываешь свои таблицы.
Потом отовсюду строишь запросы, используюя эту метадату. И все. Ничего лишнего не возникает.
Может, я неправ. Но у меня работает именно так.
niro
Авг. 2, 2007 20:42:16
Ну предположительно так
engine = create_engine('sqlite://', **kwargs)
meta = MetaData()
meta.connect(engine)
posts = Table('posts', meta, autoload = True)
...
А закрывать коннект то как ?
Андрей Светлов
Авг. 2, 2007 21:00:10
connection = engine.connect()
result = connection.execute(“select username from users”)
for row in result:
print “username:”, row
connection.close()
или
result = engine.execute(“select username from users”)
for row in result:
print “username:”, row
result.close()
connection - это еще не engine.
Кстати, у тебя свежая алхимия? В закрытых тикетах что-то такое проскальзывало.
Да, еще.
engine использует ConnectionPool. Т.е. создает несколько connections и использует их. 5 штук по умолчанию.
Это позволяет сэкономить на постоянных переподключениях.
Может быть, именно их ты видишь?
niro
Авг. 3, 2007 15:25:10
Да, вроде бы свежая - последний релиз, или стоит утянуть trunk ?
Андрей Светлов
Авг. 3, 2007 17:17:40
Не важно.
Я trunk использую - нет проблем.
Сейчас в trunk 4.0 лежит.
Но разницы особой нет (в смысле безбаговости).
axe
Сен. 8, 2008 12:08:42
Андрей Светлов
engine использует ConnectionPool. Т.е. создает несколько connections и использует их. 5 штук по умолчанию.
у меня похожая ситуация: постоянно открывается несколько соединений, потом старые закрываются, а новые создаются. и их не 5 а от 1 до 20
когда соединения создаются как в этом примере:
http://www.modpython.org/FAQ/faqw.py?req=show&file=faq03.003.htpто там будет ровно 10 открытых (постоянных) соединений, новые создаваться не будут
т.е. постоянно будут использоваться только эти и ровно 10 соединений
хотелось бы, чтоб create_engine работал точно так же.
Андрей Светлов
Сен. 8, 2008 13:35:32
Можно унаследоваться от Pool и сделать свою реализацию - ровно на 10 connections
axe
Сен. 8, 2008 14:38:47
унаследоваться от Pool - это указать параметры pool или poolclass для create_engine?
запускал указанные примеры из-под mod_python:
result = engine.execute("select username from users")
for row in result:
print "username:", row['username']
result.close()
соединение остаётся маячить в базе
connection = engine.connect()
result = connection.execute("select username from users")
for row in result:
print "username:", row['username']
connection.close()
а в этом варианте получается два соединения с базой.