当前位置:   article > 正文

Python使用PooledDB连接池连接Mysql_python pooleddb

python pooleddb

数据库连接池

数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。

影响因素

数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数制约。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。数据库连接池的最小连接数和最大连接数的设置要考虑到下列几个因素:

  1. 最小连接数是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费。
  2. 最大连接数是连接池能申请的最大连接数,如果数据库连接请求超过此数,后面的数据库连接请求将被加入到等待队列中,这会影响之后的数据库操作。
  3. 最小连接数与最大连接数差距最小连接数与最大连接数相差太大,那么最先的连接请求将会获利,之后超过最小连接数量的连接请求等价于建立一个新的数据库连接。不过,这些大于最小连接数的数据库连接在使用完不会马上被释放,它将被放到连接池中等待重复使用或是空闲超时后被释放。

原理

连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用。而连接的建立、断开都由连接池自身来管理。同时,还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等。也可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。

优势

性能提升:数据库连接的创建和销毁是一项开销较大的操作。连接池通过预先创建一定数量的数据库连接,并将它们保持在池中,可以避免频繁地创建和销毁连接。这样可以显著减少每次请求所需的时间,并大大提高系统的性能。

资源管理:连接池可以对数据库连接进行有效的管理和分配。它可以限制连接的数量,以防止资源过度使用,从而避免数据库服务器过载。连接池还可以处理连接的重用,减少了频繁地创建新连接的开销。

可伸缩性:通过连接池,您可以根据需要调整连接池的大小。这允许系统根据负载的变化自动扩展或收缩连接数,以满足不同的需求。这种可伸缩性使系统能够更好地应对高并发和大流量的情况。

连接的复用:连接池可以重复利用连接,而不是每次都创建新的连接。这避免了频繁地建立和断开连接的开销,并减少了与数据库服务器的通信开销。通过复用连接,可以更有效地利用系统资源。

错误处理:连接池可以提供错误处理机制,以处理数据库连接的错误。它可以监测连接的状态,并在发生错误时重新创建或修复连接。这样,连接池可以提高系统的稳定性和可靠性。

python实现

dbutils.pooled_db是Python中的一个库,它提供了数据库连接池的实现。该库被广泛用于管理和维护数据库连接池,以提高应用程序与数据库的交互性能。

import pymysql
from dbutils.pooled_db import PooledDB

host = 'localhost'
port = 3306
user = 'root'
password = '123456'
database = 'evos_gr_version1'


class MySQLConnectionPool:

    def __init__(self,):
        self.pool = PooledDB(
            creator=pymysql,  # 使用链接数据库的模块
            mincached=10,  # 初始化时,链接池中至少创建的链接,0表示不创建
            maxconnections=200,  # 连接池允许的最大连接数,0和None表示不限制连接数
            blocking=True,  # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错
            host=host,
            port=port,
            user=user,
            password=password,
            database=database
        )

    def open(self):
        self.conn = self.pool.connection()
        self.cursor = self.conn.cursor(cursor=pymysql.cursors.DictCursor)  # 表示读取的数据为字典类型
        return self.conn, self.cursor

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

    def select_one(self, sql, *args):
        """查询单条数据"""
        conn, cursor = self.open()
        cursor.execute(sql, args)
        result = cursor.fetchone()
        self.close(conn, cursor)
        return result

    def select_all(self, sql, *args):
        """查询多条数据"""
        conn, cursor = self.open()
        cursor.execute(sql, args)
        result = cursor.fetchall()
        self.close(conn, cursor)
        return result

    def insert_one(self, sql, *args):
        """插入单条数据"""

        try:
            self.execute(sql, args, isNeed=True)
        except Exception as err:
            return {'result': False, 'err': err}

    def insert_all(self, sql, datas):
        """插入多条批量插入"""
        conn, cursor = self.open()
        try:
            cursor.executemany(sql, datas)
            conn.commit()
            return {'result': True, 'id': int(cursor.lastrowid)}
        except Exception as err:
            conn.rollback()
            return {'result': False, 'err': err}

    def update_one(self, sql, args):
        """更新数据"""
        self.execute(sql, args, isNeed=True)

    def delete_one(self, sql, *args):
        """删除数据"""
        self.execute(sql, args, isNeed=True)

    def execute(self, sql, args, isNeed=False):
        """
        执行
        :param isNeed 是否需要回滚
        """
        conn, cursor = self.open()
        if isNeed:
            try:
                cursor.execute(sql, args)
                conn.commit()
            except:
                conn.rollback()
        else:
            cursor.execute(sql, args)
            conn.commit()
        self.close(conn, cursor)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93

连接

mysql = MySQLConnectionPool()
  • 1

1.插入

sql_insert_one = "insert into `configuration` (`system`, blocksize, inodesize) values (%s,%s,%s)"
mysql.insert_one(sql_insert_one, ('ext4', '1024', 512))

datas = [
    ('ext4', '1024', 512),
    ('ext2', '1024', 256),
]
sql_insert_all = "insert into `configuration` (`system`, blocksize, inodesize) values (%s,%s,%s)"
mysql.insert_all(sql_insert_all, datas)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

2.删除

sql_delete_one = "delete from `cofiguration` where `system`=%s "
mysql.delete_one(sql_delete_one, ('ext2',))
  • 1
  • 2

3.修改

sql_update_one = "update `cofiguration` set blocksize=%s where `system`=%s"
mysql.update_one(sql_update_one, (1024, 'ext4'))
  • 1
  • 2

4.查询

sql_select_one = "select * from `cofiguration` where `system`=%s"
results = mysql.select_one(sql_select_one, ('ext4',))
print(results)

sql_select_all = "select * from `cofiguration` where `system`=%s"
results = mysql.select_all(sql_select_all, ('ext4',))
print(results)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/172729
推荐阅读
相关标签
  

闽ICP备14008679号