基于dbutils的数据库连接池搭建(mysql)

该博客介绍了如何在Python的Flask应用中使用DBUtils库创建数据库连接池,以优化数据库操作的性能。通过设置连接池参数,如最大连接数,实现了高效管理和复用数据库连接。示例代码展示了如何进行数据库查询、插入、更新、删除等操作,并通过装饰器记录函数执行时间。此外,还提供了存储过程的调用方法。
摘要由CSDN通过智能技术生成

官网

https://webwareforpython.github.io/DBUtils/main.html

安装

pip install dbutils

编辑代码如下

import time
import pymysql
from dbutils.pooled_db import PooledDB

from flask import Flask
import logging

app = Flask(__name__)

MYSQL = {
    "host": "",
    "port": 27546,
    "db": "",
    "username": "",
    "passwd": ""
}


def call_time(func):
    def inner(*args, **kwargs):
        old_time = time.time()
        result = func(*args, **kwargs)
        func_name = str(func).split(' ')[1]
        print('{} use time: {}s'.format(func_name, time.time() - old_time))
        logging.info('{} use time: {}s'.format(func_name, time.time() - old_time))
        return result

    return inner


class MySQLHandler(object):

    def __init__(self):
        """
        :param mincached:连接池中空闲连接的初始数量
        :param maxcached:连接池中空闲连接的最大数量
        :param maxshared:共享连接的最大数量
        :param maxconnections:创建连接池的最大数量
        :param blocking:超过最大连接数量时候的表现,为True等待连接数量下降,为false直接报错处理
        :param maxusage:单个连接的最大重复使用次数
        :param setsession:optional list of SQL commands that may serve to prepare
            the session, e.g. ["set datestyle to ...", "set time zone ..."]
        :param reset:how connections should be reset when returned to the pool
            (False or None to rollback transcations started with begin(),
            True to always issue a rollback for safety's sake)
        :param host:数据库ip地址
        :param port:数据库端口
        :param db:库名
        :param user:用户名
        :param passwd:密码
        :param charset:字符编码
        """
        self.pool = PooledDB(
            creator=pymysql,
            maxconnections=20,
            blocking=True,
            host=MYSQL['host'],
            port=MYSQL['port'],
            user=MYSQL['username'],
            password=MYSQL['passwd'],
            database=MYSQL['db'],
            charset='utf8'
        )

    def get_conn(self):
        conn = self.pool.connection()
        cursor = conn.cursor(pymysql.cursors.DictCursor)
        return conn, cursor

    def close_conn(self, conn, cursor):
        cursor.close()
        conn.close()

    def fetch_one(self, sql, args=None):
        conn, cursor = self.get_conn()
        cursor.execute(sql, args)
        res = cursor.fetchone()
        self.close_conn(conn, cursor)
        return res

    def fetch_all(self, sql, args=None):
        conn, cursor = self.get_conn()
        cursor.execute(sql, args)
        res = cursor.fetchall()
        self.close_conn(conn, cursor)
        return res

    def insert_one(self, sql, args=None):
        conn, cursor = self.get_conn()
        res = cursor.execute(sql, args)
        conn.commit()
        self.close_conn(conn, cursor)
        return res

    def insert_batch(self, sql, args=None):
        conn, cursor = self.get_conn()
        res = cursor.executemany(sql, args)
        conn.commit()
        self.close_conn(conn, cursor)
        return res

    def update(self, sql, args=None):
        conn, cursor = self.get_conn()
        res = cursor.execute(sql, args)
        conn.commit()
        self.close_conn(conn, cursor)
        return res

    def delete(self, sql, args=None):
        conn, cursor = self.get_conn()
        res = cursor.execute(sql, args)
        conn.commit()
        self.close_conn(conn, cursor)
        return res

    # 存储函数调用(无返回值 ,增删改)
    # 参数格式 args=(1, 2, 3, 0)
    def mfunctionVo(self, name, args=None):
        conn, cursor = self.get_conn()
        cursor.callproc(name, args)
        conn.commit()
        self.close_conn(conn, cursor)

    # 存储函数调用(有返回值,查)
    # 参数格式 args=(1, 2, 3, 0)
    def mfunctionRe(self, name, args=None):
        conn, cursor = self.get_conn()
        cursor.callproc(name, args)
        conn.commit()
        res = cursor.fetchall()
        self.close_conn(conn, cursor)
        return res


mh = MySQLHandler()


@app.route("/", methods=["GET"])
@call_time
def index():
    sql_str = f"SELECT * FROM speaker WHERE phone='19037138680'"
    ret = mh.fetch_one(sql_str)
    time.sleep(1)
    print(ret)
    logging.info(ret)
    return ret


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000, debug=False)

操作示例

mysql_handler = MySQLHandler()
table_name = 'table_name'
sql_str = f'insert into {table_name} (email, password, update_time) values (%s, %s,now())'
args = (email, password)
mysql_handler.insert_one(sql_str, args)
DBUtils 是一个开源的 JDBC 工具库,它提供了一组简单易用的 API,帮助我们更方便地使用 JDBC 操作数据库。其中,DBCP(DataBase Connection Pool)是 DBUtils 提供的一个数据库连接池,可以有效地管理数据库连接,提高应用程序的性能和稳定性。 下面是利用 DBUtils 创建数据库连接池的步骤: 1. 导入相关依赖包(DBUtils数据库驱动)。 2. 在配置文件中设置数据库连接信息,包括数据库 URL、用户名、密码等。 3. 使用 BasicDataSource 对象创建一个连接池,并设置相关参数,如最大连接数、最大空闲时间等。 4. 通过连接池获取数据库连接,执行 SQL 操作。 下面是一个示例代码: ```java import java.sql.Connection; import java.sql.SQLException; import org.apache.commons.dbcp2.BasicDataSource; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanListHandler; public class DBUtilsDemo { public static void main(String[] args) { // 配置数据库连接信息 String url = "jdbc:mysql://localhost:3306/test"; String username = "root"; String password = "123456"; // 创建连接池 BasicDataSource dataSource = new BasicDataSource(); dataSource.setUrl(url); dataSource.setUsername(username); dataSource.setPassword(password); dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setInitialSize(5); dataSource.setMaxTotal(10); dataSource.setMaxIdle(8); dataSource.setMaxWaitMillis(10000); // 获取连接并执行 SQL 操作 try(Connection conn = dataSource.getConnection()) { QueryRunner runner = new QueryRunner(); String sql = "SELECT * FROM student"; BeanListHandler<Student> handler = new BeanListHandler<>(Student.class); List<Student> students = runner.query(conn, sql, handler); // 处理查询结果 } catch (SQLException e) { e.printStackTrace(); } } } ``` 在上面的示例代码中,我们首先通过 BasicDataSource 对象设置了数据库连接信息,并创建了一个连接池。然后,通过 getConnection() 方法从连接池中获取一个数据库连接,并使用 QueryRunner 对象执行了一条 SQL 查询语句。最后,我们可以对查询结果进行处理。注意,在使用完数据库连接后,需要及时释放连接,否则会导致连接泄漏,从而影响应用程序的性能和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值