Поток конкретных данных с WebPy - PullRequest
2 голосов
/ 20 января 2009

Я пишу небольшое веб-приложение с webpy, и мне интересно, есть ли у кого-нибудь какая-либо информация о моей маленькой проблеме.

Я написал небольшую систему ORM, и она, кажется, работает довольно хорошо. В идеале я хотел бы сшить это с webpy, но похоже, что использование его как есть вызывает проблемы с потоками (соединение с БД создается / осуществляется через границы потоков, или, таким образом, состояния исключения).

Кто-нибудь знает, как я могу (в пределах webpy) создать свое соединение с БД в том же потоке, что и остальная часть кода обработки страницы?

Ответы [ 2 ]

4 голосов
/ 06 февраля 2009

Мы используем SQLAlchemy с web.py и используем ловушки для создания и закрытия соединений с БД по запросу. SQLAlchemy управляет пулами, поэтому не каждое соединение является TCP-соединением.

Локальное хранилище потока, которое вы хотите использовать, это web.ctx, т.е. каждый раз, когда вы обращаетесь к web.ctx, вы видите только свойства, заданные этим потоком.

Наш код выглядит примерно так:

def sa_load_hook():
    web.ctx.sadb = Session()

def sa_unload_hook():
    web.ctx.sadb.close()

web.loadhooks['sasession'] = sa_load_hook
web.unloadhooks['sasession'] = sa_unload_hook

Замените Session на функцию соединения с БД, и она должна нормально работать для вас.

2 голосов
/ 20 января 2009

Я попробую. Отказ от ответственности: у меня нет опыта работы с фреймворком web.py.

Я предлагаю вам попробовать следующее:

(1) Создайте глобальный экземпляр threading.local для отслеживания локальных объектов вашего потока (в вашем случае он будет отслеживать только один объект - сеанс базы данных).

import threading
serving = threading.local()

(2) В начале каждого запроса создайте соединение / сеанс БД и сохраните его в экземпляре threading.local. Если я правильно понимаю документацию web.py , вы можете сделать следующее:

def setup_dbconnection(handler): 
    serving.dbconnection = create_dbconnection(...)
    try:
        return handler()
    finally:
        serving.dbconnection.close() # or similar

app.add_processor(setup_dbconnection)

(3) В ваших методах контроллера (если они называются так в web.py?) Всякий раз, когда вам нужно соединение с БД, используйте serve.dbconnection.

...