python关闭mysql连接池_Python MySQL 连接池设置

Python MySQL 连接池设置

项目中连接数据库不设置连接池直接操作数据库,频繁的创建数据库连接比较耗费资源,这里是我整理改了改的python连接池的代码

文件目录结构

├── init.py

├── myProjectConfig.cnf

└── MySqlConn.py

详细代码

配置文件 conf.ini

[lcoal]

host = 127.0.0.1

port = 3306

user = zqpy

password = 123456

mincached=10

maxcached=20

连接池核心代码 MySqlConn.py

#!/usr/bin/env python

# -*- coding:utf-8 -*-

import pymysql, os, configparser

from pymysql.cursors import DictCursor

from DBUtils.PooledDB import PooledDB

class Config(object):

"""

# Config().get_content("user_information")

配置文件里面的参数

[notdbMysql]

host = 192.168.1.101

port = 3306

user = root

password = python123

"""

def __init__(self, config_filename="conf.ini"):

file_path = os.path.join(os.path.dirname(__file__), config_filename)

self.cf = configparser.ConfigParser()

self.cf.read(file_path)

def get_sections(self):

return self.cf.sections()

def get_options(self, section):

return self.cf.options(section)

def get_content(self, section):

result = {}

for option in self.get_options(section):

value = self.cf.get(section, option)

result[option] = int(value) if value.isdigit() else value

return result

class BasePymysqlPool(object):

def __init__(self, mincached, maxcached, host, port, user, password, db_name=None):

self.db_host = host

self.db_port = int(port)

self.user = user

self.password = str(password)

self.db = db_name

self.conn = None

self.mincached = int(mincached)

self.maxcached = int(maxcached)

class MyPymysqlPool(BasePymysqlPool):

"""

MYSQL数据库对象,负责产生数据库连接 , 此类中的连接采用连接池实现获取连接对象:conn = Mysql.getConn()

释放连接对象;conn.close()或del conn

"""

# 连接池对象

__pool = None

def __init__(self, conf_name=None):

self.conf = Config().get_content(conf_name)

super(MyPymysqlPool, self).__init__(**self.conf)

# 数据库构造函数,从连接池中取出连接,并生成操作游标

self._conn = self.__getConn()

self._cursor = self._conn.cursor()

def __getConn(self):

"""

@summary: 静态方法,从连接池中取出连接

@return MySQLdb.connection

"""

if MyPymysqlPool.__pool is None:

__pool = PooledDB(creator=pymysql,

mincached=self.mincached,

maxcached=self.maxcached,

host=self.db_host,

port=self.db_port,

user=self.user,

passwd=self.password,

db=self.db,

use_unicode=False,

charset="utf8",

cursorclass=DictCursor)

return __pool.connection()

def getAll(self, sql, param=None):

"""

@summary: 执行查询,并取出所有结果集

@param sql:查询SQL,如果有查询条件,请只指定条件列表,并将条件值使用参数[param]传递进来

@param param: 可选参数,条件列表值(元组/列表)

@return: result list(字典对象)/boolean 查询到的结果集

"""

if param is None:

count = self._cursor.execute(sql)

else:

count = self._cursor.execute(sql, param)

if count > 0:

result = self._cursor.fetchall()

else:

result = False

return result

def getOne(self, sql, param=None):

"""

@summary: 执行查询,并取出第一条

@param sql:查询SQL,如果有查询条件,请只指定条件列表,并将条件值使用参数[param]传递进来

@param param: 可选参数,条件列表值(元组/列表)

@return: result list/boolean 查询到的结果集

"""

if param is None:

count = self._cursor.execute(sql)

else:

count = self._cursor.execute(sql, param)

if count > 0:

result = self._cursor.fetchone()

else:

result = False

return result

def getMany(self, sql, num, param=None):

"""

@summary: 执行查询,并取出num条结果

@param sql:查询SQL,如果有查询条件,请只指定条件列表,并将条件值使用参数[param]传递进来

@param num:取得的结果条数

@param param: 可选参数,条件列表值(元组/列表)

@return: result list/boolean 查询到的结果集

"""

if param is None:

count = self._cursor.execute(sql)

else:

count = self._cursor.execute(sql, param)

if count > 0:

result = self._cursor.fetchmany(num)

else:

result = False

return result

def insertMany(self, sql, values):

"""

@summary: 向数据表插入多条记录

@param sql:要插入的SQL格式

@param values:要插入的记录数据tuple(tuple)/list[list]

@return: count 受影响的行数

"""

count = self._cursor.executemany(sql, values)

return count

def __query(self, sql, param=None):

if param is None:

count = self._cursor.execute(sql)

else:

count = self._cursor.execute(sql, param)

return count

def update(self, sql, param=None):

"""

@summary: 更新数据表记录

@param sql: SQL格式及条件,使用(%s,%s)

@param param: 要更新的 值 tuple/list

@return: count 受影响的行数

"""

return self.__query(sql, param)

def insert(self, sql, param=None):

"""

@summary: 更新数据表记录

@param sql: SQL格式及条件,使用(%s,%s)

@param param: 要更新的 值 tuple/list

@return: count 受影响的行数

"""

return self.__query(sql, param)

def delete(self, sql, param=None):

"""

@summary: 删除数据表记录

@param sql: SQL格式及条件,使用(%s,%s)

@param param: 要删除的条件 值 tuple/list

@return: count 受影响的行数

"""

return self.__query(sql, param)

def begin(self):

"""

@summary: 开启事务

"""

self._conn.autocommit(0)

def end(self, option='commit'):

"""

@summary: 结束事务

"""

if option == 'commit':

self._conn.commit()

else:

self._conn.rollback()

def dispose(self, isEnd=1):

"""

@summary: 释放连接池资源

"""

if isEnd == 1:

self.end('commit')

else:

self.end('rollback')

self._cursor.close()

self._conn.close()

if __name__ == '__main__':

mysql = MyPymysqlPool("lcoal")

sqlAll = "select * from xxx_mall.ods_kingdee_data limit 10 ;"

result = mysql.getAll(sqlAll)

print(result)

sqlAll = "select * from xxx_mall.ods_kingdee_data limit 10;"

result = mysql.getMany(sqlAll, 2)

print(result)

result = mysql.getOne(sqlAll)

print(result)

# mysql.insert("insert into xxx_mall.aa set a=%s", (1))

# 释放资源

# mysql.dispose()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用Python实现MySQL连接池可以提高数据库连接的效率和性能。下面是一个示例代码,演示了如何使用`pymysql`库实现MySQL连接池: ```python import pymysql from pymysql import connections class MySQLPool: def __init__(self, host, user, password, database, pool_size=5): self.host = host self.user = user self.password = password self.database = database self.pool_size = pool_size self.connection_pool = [] def init_pool(self): for _ in range(self.pool_size): conn = pymysql.connect( host=self.host, user=self.user, password=self.password, database=self.database ) self.connection_pool.append(conn) def get_connection(self): if len(self.connection_pool) == 0: raise Exception("Connection pool is empty") return self.connection_pool.pop() def release_connection(self, conn): self.connection_pool.append(conn) # 示例用法 pool = MySQLPool('127.0.0.1', 'root', 'root', 'pythondb', pool_size=5) pool.init_pool() # 从连接池获取连接 conn = pool.get_connection() cursor = conn.cursor() # 执行SQL查询 cursor.execute("SELECT * FROM table_name") result = cursor.fetchall() # 释放连接回连接池 pool.release_connection(conn) ``` 这个示例代码中,我们创建了一个`MySQLPool`类,它接受数据库的连接参数和连接池的大小作为参数。在`init_pool`方法中,我们初始化了连接池,创建了指定数量的数据库连接。`get_connection`方法用于从连接池中获取一个连接,`release_connection`方法用于释放连接并将其返回到连接池中。 请注意,这只是一个简单的示例,实际使用中可能需要根据具体需求进行适当的修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值