Пулы соединений Django и поля времени - PullRequest
6 голосов
/ 20 марта 2009

У кого-нибудь есть пул соединений, работающий с Django, SQLAlchemy и MySQL?

Я использовал этот учебник (http://node.to/wordpress/2008/09/30/another-database-connection-pool-solution-for-django-mysql/), который работал отлично, но проблема, с которой я сталкиваюсь, заключается в том, что всякий раз, когда я возвращаю поле времени, оно преобразуется в временную дельту, поскольку специфические для Django преобразования не используются.

Код преобразования из django / db / backends / mysql / base.py

django_conversions = conversions.copy()
django_conversions.update({
FIELD_TYPE.TIME: util.typecast_time,
FIELD_TYPE.DECIMAL: util.typecast_decimal,
FIELD_TYPE.NEWDECIMAL: util.typecast_decimal,

})

Код подключения из артикула:

if settings.DATABASE_HOST.startswith('/'):
            self.connection = Database.connect(port=kwargs['port'], 
                                               unix_socket=kwargs['unix_socket'], 
                                               user=kwargs['user'], 
                                               db=kwargs['db'], 
                                               passwd=kwargs['passwd'], 
                                               use_unicode=kwargs['use_unicode'], 
                                               charset='utf8')
        else:
            self.connection = Database.connect(host=kwargs['host'], 
                                               port=kwargs['port'], 
                                               user=kwargs['user'], 
                                               db=kwargs['db'], 
                                               passwd=kwargs['passwd'], 
                                               use_unicode=kwargs['use_unicode'], 
                                               charset='utf8')

1 Ответ

1 голос
/ 25 мая 2012

В стволе Django отредактируйте django / db / init .py и закомментируйте строку:

signals.request_finished.connect (close_connection)

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

Еще одно необходимое изменение в django / middleware / Transactions.py; удалите два тестаaction.is_dirty () и всегда вызывайте commit () или rollback (). В противном случае транзакция не будет зафиксирована, если она будет считываться только из базы данных, что оставит открытыми блокировки, которые должны быть закрыты.

...