Форум сайта python.su
Ладно, всё, впринципе, решаемо, но вот собрался я разобраться с пулом соединений… В документации информации маловато (или я не нашёл?). Вот здесь я насторожился…
Как сделать так, чтобы при создании сессии соединение для неё бралось из пула. При этом сессии будут создаваться в большом количестве и в разных нитях одновременно. А то делать так:
Session = sessionmaker(bind = create_engine(“postgres://root:root@localhost:5432/V”),
autoflush = False, transactional = True)()
## Решение второго вопроса предидущей темы, потом оформлю и добавлю в алхимию.
SessionId = Session.connection().execute(“SELECT open_session(%s, %s, %s)”, (“root”, “root”, “127.0.0.1”)).fetchone() ## Здесь создаётся сессия _пользователя_, так что не пугайтесь… :-)
Session.commit()
Как-то не красиво (ну можно, конечно оформить) и медленно (а если у меня будет несколько десятков запросов в секунду?).
Изобретать пылесос и самому писать пул, меня как-то не прельщает.
Ещё вопрос: в моём варианте, после уничтожения Session будет закрыто соединение?
Офлайн
Насчёт пула не знаю, но для потоков, есть scoped_session. http://www.sqlalchemy.org/docs/04/session.html#unitofwork_contextual. Это правда совсем не пул. Но чтоб для одного потока не создавалось несколько коннектов работает. Соединение не создаётся если оно уже создано для этого потока. Не знаю подойдёт ли это для Вашей задачи.
Офлайн
Сейчас посмотрел, документацию, так там же есть пул :-) если create_engine указать указать соответствующие параметры http://www.sqlalchemy.org/docs/04/dbengine.html#dbengine_options …или я не понял вопрос.
Офлайн
Ага… Нашёл. Спасибо. Я, сначала, не врубился как подключить пул. Создать, это всегда пожалуйста, а использовать… А на самом деле всё просто.
Просто документация по алхимии какая-то сумбурная… не то, что по Qt… :-)
Вопрос закрыт.
P.S. Я переключаюсь на другой проект, так что пока перестаю мучить алхилию и вас…
Офлайн
Поправьте, если ошибаюсь.
create_engine(…, strategy='threadlocal', …) - позволяет избежать повторного создания соединения в пределах одного потока.
..bw
Отредактировано (Май 24, 2008 13:11:56)
Офлайн
bwВсё верно. Но не пойдёт. У меня в одной нити позможно несколько различных сессий и каждая со своей транзакцией. Хотя это зло, с которым нужно боротся.
Поправьте, если ошибаюсь.
create_engine(…, strategy='threadlocal', …) - позволяет избежать повторного создания соединения в пределах одного потока.
Офлайн