数据库连接池
Posted 心如沚水
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库连接池相关的知识,希望对你有一定的参考价值。
一 将pymysql 封装为类MysqlHelper
import pymysql from flask import current_app # from settings import DevelopmentConfig class DBHelper(): def __init__(self,cursor=pymysql.cursors.DictCursor): self.conn = None self.cursor = None self.connect(cursor) def connect(self,cursor): pool = current_app.config[‘MYSQL_POOL‘] # pool = DevelopmentConfig.MYSQL_POOL self.conn = pool.connection() self.cursor = self.conn.cursor(cursor=cursor) # 指定单条语句 def modify(self, sql, arg=None): # 去数据库里面学生表插入一条新数据 # 指定输出的结果类型是字典 self.cursor.execute(sql, arg) self.conn.commit() # 批量执行单条语句 def pl_modify(self, sql, arg=None): # 去数据库里面学生表插入一条新数据 self.cursor.executemany(sql, arg) self.conn.commit() # 指定单条语句 def create(self, sql, arg=None): # 去数据库里面学生表插入一条新数据 self.cursor.execute(sql, arg) the_id = self.cursor.lastrowid self.conn.commit() return the_id # 查询单个数据记录 def get_one(self, sql, arg=None): self.cursor.execute(sql, arg) ret = self.cursor.fetchone() return ret # 查询多条数据 def get_list(self, sql, arg=None): self.cursor.execute(sql, arg) ret = self.cursor.fetchall() return ret def close(self): self.cursor.close() self.conn.close() # 进入with语句自动执行 def __enter__(self): return self # 退出with语句块自动执行 def __exit__(self, exc_type, exc_val, exc_tb): self.close()
二 mysql连接池的配置
MYSQL_POOL = PooledDB( creator=pymysql, # 使用链接数据库的模块 maxconnections=6, # 连接池允许的最大连接数,0和None表示不限制连接数 mincached=2, # 初始化时,链接池中至少创建的空闲的链接,0表示不创建 maxcached=5, # 链接池中最多闲置的链接,0和None不限制 maxshared=3, # 链接池中最多共享的链接数量,0和None表示全部共享。PS: 无用,因为pymysql和MySQLdb等模块的 threadsafety都为1,所有值无论设置为多少,_maxcached永远为0,所以永远是所有链接都共享。 blocking=True, # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错 maxusage=None, # 一个链接最多被重复使用的次数,None表示无限制 setsession=[], # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."] ping=0, # ping MySQL服务端,检查是否服务可用。# 如:0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = always host=‘127.0.0.1‘, port=3306, user=‘root‘, password=‘123‘, database=‘s8_day127‘, charset=‘utf8‘ )
三 Flask 中数据库连接池如何设置在配置文件中
要将连接池的配置直接放在配置文件中
class DevelopmentConfig(BaseConfig): SESSION_KEY_PREFIX = ‘hello‘ # redis中key的会在uuid钱加前缀 SESSION_TYPE = ‘redis‘ SESSION_REDIS = Redis(host=‘127.0.0.1‘,port=6379) import time import pymysql import threading from DBUtils.PooledDB import PooledDB, SharedDBConnection MYSQL_POOL = PooledDB( creator=pymysql, # 使用链接数据库的模块 maxconnections=6, # 连接池允许的最大连接数,0和None表示不限制连接数 mincached=2, # 初始化时,链接池中至少创建的空闲的链接,0表示不创建 maxcached=5, # 链接池中最多闲置的链接,0和None不限制 maxshared=3, # 链接池中最多共享的链接数量,0和None表示全部共享。PS: 无用,因为pymysql和MySQLdb等模块的 threadsafety都为1,所有值无论设置为多少,_maxcached永远为0,所以永远是所有链接都共享。 blocking=True, # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错 maxusage=None, # 一个链接最多被重复使用的次数,None表示无限制 setsession=[], # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."] ping=0, # ping MySQL服务端,检查是否服务可用。# 如:0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = always host=‘127.0.0.1‘, port=3306, user=‘root‘, password=‘123‘, database=‘s8_day127‘, charset=‘utf8‘ )
单独建一个文件会存在导入app.config问题
以上是关于数据库连接池的主要内容,如果未能解决你的问题,请参考以下文章
newCacheThreadPool()newFixedThreadPool()newScheduledThreadPool()newSingleThreadExecutor()自定义线程池(代码片段
连接池报错 Proxool Provider unable to load JAXP configurator file: proxool.xml
MySQL与Redis数据库连接池介绍(图示+源码+代码演示)