2009-03-20 6 views
6

Hat jemand Verbindung Pooling mit Django, SQLAlchemy und MySQL arbeiten?Django Verbindung Pooling und Zeit Felder

Ich habe dieses Tutorial (http://node.to/wordpress/2008/09/30/another-database-connection-pool-solution-for-django-mysql/) verwendet, das super funktionierte, aber das Problem ist, wenn ich ein Zeitfeld zurückbringe, wird es in ein Timedelta konvertiert, da die Django-spezifischen Conversions nicht verwendet werden.

Conversion-Code von 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, 

})

Anschluss-Code aus dem Artikel:

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

Django hat ein eigenes ORM, es verwendet SQlAlchemy nur, wenn Sie es manuell einrichten. –

Antwort

1

In Django Stamm, bearbeiten django/db/init .py und kommentieren Sie die Zeile:

signal.request_finished.connect (close_connection)

Dieser Signal-Handler bewirkt, dass er sich nach jeder Anforderung von der Datenbank trennt. Ich weiß nicht, welche Nebenwirkungen das alles hat, aber es macht keinen Sinn, nach jeder Anfrage eine neue Verbindung zu starten. Es zerstört die Leistung, wie Sie bemerkt haben.

Eine weitere notwendige Änderung ist in Django/Middleware/transaction.py; Entfernen Sie die beiden transaction.is_dirty() -Tests und rufen Sie immer commit() oder rollback() auf. Andernfalls wird keine Transaktion ausgeführt, wenn sie nur aus der Datenbank liest, wodurch Sperren geöffnet bleiben, die geschlossen werden sollten.