Автономный web2py-DAL с Pyramid - запросы, потоки и память - PullRequest
3 голосов
/ 04 апреля 2011

Я создаю приложение на платформе Pyramid и хотел бы использовать с ним web2py-DAL.Встроенная в Firebird база данных.

Это прекрасно работает, пока я не попытаюсь вызвать несколько представлений с одной веб-страницы асинхронно.Различные ошибки, такие как «Недопустимое состояние курсора», «Недопустимая ссылка курсора» или «Попытка повторно закрыть закрытый курсор», появляются из драйвера kinterbasdb, где sqlite просто ломается без каких-либо сообщений об ошибках и забирает с собой python.Эти вызываемые представления делают только простое чтение с помощью SELECTing.

Это происходит в том случае, если корневая фабрика пирамид возвращает один и тот же объект DAL при каждом запросе.Кажется, что потоки из разных запросов работают с одним и тем же объектом курсора, поэтому курсор закрывается, в то время как другой поток предполагает, что курсор находится здесь.

Если я создаю новый объект DAL при каждом запросе, я получаюДругая проблема - каждое новое соединение по каждому запросу выделяет память, и эта память не освобождается.Таким образом, после нескольких запросов доцентов память теряется сотнями МБ.

К сожалению, Sqlalchemy не подходит для этого проекта.

Есть какие-нибудь идеи?

Ответы [ 2 ]

2 голосов
/ 06 апреля 2011

Дело в том, что объект DAL должен создаваться при каждом запросе. Но после этого он должен быть закрыт вручную.

Я сделал это таким образом: есть

request.add_finished_callback

свойство объекта запроса, поэтому я расширил объект DAL следующим образом:

class Root(DAL):
    def __init__(self, request, uri):
        DAL.__init__(self, uri, pool_size=0)
        request.add_finished_callback(self._close)

    def _close(self, request):
        self._adapter.close_all_instances('commit')

Новый корневой объект затем возвращается root_factory при каждом запросе.

Благодаря web2py-users group!

1 голос
/ 06 апреля 2011

Некоторые решения из списка рассылки web2py.

...