天天看點

python mysql 持久連接配接_python-Django持久資料庫連接配接

我做了一些小的自定義psycopg2後端,該後端使用全局變量實作了持久連接配接。有了這個,我能夠将每秒的請求數量從350改善到1600(在非常簡單的頁面上,很少有選擇)隻需将其儲存在任何目錄中名為base.py的檔案中(例如postgresql_psycopg2_persistent)并在設定中進行設定

DATABASE_ENGINE到項目名稱.postgresql_psycopg2_persistent

注意!!! 代碼不是線程安全的-由于意外的結果,您不能将其與python線程一起使用,如果使用mod_wsgi,請線上程= 1時使用prefork守護程式模式

# Custom DB backend postgresql_psycopg2 based

# implements persistent database connection using global variable

from django.db.backends.postgresql_psycopg2.base import DatabaseError, DatabaseWrapper as BaseDatabaseWrapper, \

IntegrityError

from psycopg2 import OperationalError

connection = None

class DatabaseWrapper(BaseDatabaseWrapper):

def _cursor(self, *args, **kwargs):

global connection

if connection is not None and self.connection is None:

try: # Check if connection is alive

connection.cursor().execute('SELECT 1')

except OperationalError: # The connection is not working, need reconnect

connection = None

else:

self.connection = connection

cursor = super(DatabaseWrapper, self)._cursor(*args, **kwargs)

if connection is None and self.connection is not None:

connection = self.connection

return cursor

def close(self):

if self.connection is not None:

self.connection.commit()

self.connection = None

或者這是一個線程安全的線程,但是python線程不使用多個核心,是以您将不會獲得像上一個核心那樣的性能提升。 您也可以将其與多程序一起使用。

# Custom DB backend postgresql_psycopg2 based

# implements persistent database connection using thread local storage

from threading import local

from django.db.backends.postgresql_psycopg2.base import DatabaseError, \

DatabaseWrapper as BaseDatabaseWrapper, IntegrityError

from psycopg2 import OperationalError

threadlocal = local()

class DatabaseWrapper(BaseDatabaseWrapper):

def _cursor(self, *args, **kwargs):

if hasattr(threadlocal, 'connection') and threadlocal.connection is \

not None and self.connection is None:

try: # Check if connection is alive

threadlocal.connection.cursor().execute('SELECT 1')

except OperationalError: # The connection is not working, need reconnect

threadlocal.connection = None

else:

self.connection = threadlocal.connection

cursor = super(DatabaseWrapper, self)._cursor(*args, **kwargs)

if (not hasattr(threadlocal, 'connection') or threadlocal.connection \

is None) and self.connection is not None:

threadlocal.connection = self.connection

return cursor

def close(self):

if self.connection is not None:

self.connection.commit()

self.connection = None