Django支持数据库长连接
2014-02-19
Django  / 已有3209人围观

Django的数据库连接是在查询的时候实时创建的,用完就会关掉,这样就会频繁的开启/关闭连接,会导致延迟的产生,影响网站的访问速度。所以我们可以利用sqlalchemy建立Django database pooling让数据库保持长连接。具体方法步骤如下:
    1. 安装sqlalchemy

sudo apt-get install python-sqlalchemy

或者使用pip安装

pip install SQLAlchemy

2. 建立Django database pooling

在项目中新建一个文件夹mysql_pool,将python2.x/dist-packages/django/db/backends/mysql内的文件拷贝到mysql_pool中,按照下面的方式修改base.py。

diff -u -r db/backends/mysql/base.py db/backends/mysql/base.py
--- db/backends/mysql/base.py   2010-09-12 15:31:28.000000000 +0400
+++ db/backends/mysql/base.py   2010-09-12 15:54:33.944885295 +0400
@@ -13,6 +13,9 @@
     from django.core.exceptions import ImproperlyConfigured
     raise ImproperlyConfigured("Error loading MySQLdb module: %s" % e)
 
+from sqlalchemy import pool
+Database = pool.manage(Database)
+
 # We want version (1, 2, 1, 'final', 2) or later. We can't just use
 # lexicographic ordering in this check because then (1, 2, 1, 'gamma')
 # inadvertently passes the version test.
@@ -294,7 +297,27 @@
       # "UPDATE", not the number of changed rows.
       kwargs['client_flag'] = CLIENT.FOUND_ROWS
       kwargs.update(settings_dict['OPTIONS'])
-      self.connection = Database.connect(**kwargs)
+      #self.connection = Database.connect(**kwargs)
+      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.get('port', 3306),
+              user=kwargs['user'],
+              db=kwargs['db'],
+              passwd=kwargs['passwd'],
+              use_unicode=kwargs['use_unicode'],
+              charset='utf8'
+          ) 
       self.connection.encoders[SafeUnicode] = self.connection.encoders[unicode]
       self.connection.encoders[SafeString] = self.connection.encoders[str]
       connection_created.send(sender=self.__class__, connection=self)

3. 配置backend
    将settings.py中的DATABASES配置修改为

DATABASES = {
    'default': {
        'ENGINE': 'geekblog.mysql_pool',
        'NAME': DB_NAME,
        'USER': DB_USER_NAME,
        'PASSWORD': DB_USER_PWD,
        'HOST': DB_HOST,
        'PORT': '3306',
    }
}

完成后可以使Django和MySQL保持长连接,提高性能。另外,也可以参考另外一种实现Django支持长连接的方法:让Django支持数据库长连接(可以提高不少性能哦)

Over!

本文地址:http://xianglong.me/article/django-support-mysql-long-connection/

特别声明:本站文章,如非注明,皆为降龙原创。转载需注明本文链接并保证链接可用。