PythonはMysql接続プールを使用


0 X 00データベース接続プールを使用する理由
通常、pymysqlやデータベース接続パッケージを使用してデータベースと対話することに慣れている場合があります.コードは次のようになります.
import pymysql

config = {
    'host': config_template['MYSQL']['HOST'],
    'port': config_template['MYSQL']['PORT'],
    'user': config_template['MYSQL']['USER'],
    'password': config_template['MYSQL']['PASSWD'],
    'db': config_template['MYSQL']['DB'],
    'charset': config_template['MYSQL']['CHARSET'],
    'cursorclass': pymysql.cursors.DictCursor
}

def db_conn():
    conn = pymysql.connect(**config)
    cursor = conn.cursor()
    return conn,cursor

つまり、接続データベースをメソッドにカプセル化し、接続が必要なたびにconnオブジェクトとcursorオブジェクトを取得するように呼び出すと、接続の確立->データベース操作の実行->接続の解放が必要になるため、損失が発生します.一方、データベース接続プールは、複数のデータベース接続が保存されているプールを維持するために、データベースを接続する必要があるたびに、接続プールから1つの接続を取り出して使用すればよい.使用後、接続は解放されず、接続プールに返却して管理し、接続を絶えず確立し、接続を解放する過程を節約する.
0 X 01 DBUtilsによるデータベース接続プールの構築
import pymysql
from g_conf.config import config_template
from DBUtils.PooledDB import PooledDB


class MysqlPool:
    config = {
        'creator': pymysql,
        'host': config_template['MYSQL']['HOST'],
        'port': config_template['MYSQL']['PORT'],
        'user': config_template['MYSQL']['USER'],
        'password': config_template['MYSQL']['PASSWD'],
        'db': config_template['MYSQL']['DB'],
        'charset': config_template['MYSQL']['CHARSET'],
        'maxconnections': 70, #          
        'cursorclass': pymysql.cursors.DictCursor
    }
    pool = PooledDB(**config)

    def __enter__(self):
        self.conn = MysqlPool.pool.connection()
        self.cursor = self.conn.cursor()
        return self

    def __exit__(self, type, value, trace):
        self.cursor.close()
        self.conn.close()

DBUtilsによって、MysqlPoolクラスのクラス属性としてPooledDBオブジェクトがインスタンス化され、__が書き換えられることがわかります.enter__および_exit__メソッドはwith文に入ると接続プールからデータベース接続を取得し、with文が終わると自動的に接続プールを解放し、接続プールに返します.
使用方法は通常の接続mysqlと変わりません.with文で呼び出せばいいです.
def func(tar_id):
    with MysqlPool() as db:
        db.cursor.execute('YOUR_SQL')
        db.conn.commit()

アクセサリーの使い方:
def db_conn(func):
    def wrapper(*args, **kw):
        with MysqlPool() as db:
            result = func(db, *args, **kw)
        return result
    return wrapper

@db_conn
def update_info(db, *args, **kw):
    try:
        db.cursor.execute("YOUR_SQL")
        db.conn.commit()
        return 0
    except Exception as e:
        db.conn.rollback()
        return 1

DBUtilsには強力な機能がたくさんあります.より多くのニーズがあれば、関連ドキュメントを自分で参照することができます.本稿では、レンガを投げて玉を引くだけで、データベース接続プールの使用方法を提供します.