python数据库连接池,flask怎么连接数据库
数据库连接池
DBUtils是用于数据库连接池的Python模块。
安装
在官网下载https://pypi.org/project/DBUtils/1.2/,然后安装:
连接池有两种方式
(1)模式1
为每个线程创建一个连接。即使线程调用了close方法,也不会关闭,只是把连接放回连接池中,供自己的线程再次使用。当线程终止时,连接会自动关闭。
POOL=PersistentDB(
Creator=pymysql,#使用链接数据库的模块
Maxusage=None,#链接可以重用的最大次数,以及None表示法。
Setsession=[],#启动会话前执行的命令列表。如:[SetDateStyleto . ,设置时区.]
ping=0,
#pingMySQL server以检查服务是否可用。#例如:0=无=从不,1=默认=请求时,2=创建时,4=执行时,7=总是
可关闭=假,
#如果为False,则conn.close()实际上在下次使用时会被忽略,然后在线程关闭时链接会自动关闭。如果为真,则conn.close()关闭链接,然后再次调用pool.connection时会报错,因为连接已经真正关闭了(pool.steady_connection()可以获取新的链接)
Threadlocal=None,#这个线程有独占值对象,用来保存链接的对象。如果链接对象被重置,
host=127.0.0.1 ,
端口=3306,
user=root ,
密码=123 ,
database=pooldb ,
charset=utf8
)
deffunc():
conn=pool . connection(shareable=False)
cursor=conn.cursor()
cursor . execute( select * from B1 )
result=cursor.fetchall()
cursor.close()
conn.close()
Func()相关推荐:《Python视频教程》
(2)模式二,推荐方式。
创建多个连接,当多个线程到来时,获取它们,
进口时间
importpymysql
importthreading
fromDBUtils.PooledDBimportPooledDB,SharedDBConnection
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=[],#开始会话前执行的命令列表。如:["setdatestyleto...","settimezone..."]
ping=0,
#pingMySQL服务端,检查是否服务可用。#如:0=None=never,1=default=wheneveritisrequested,2=whenacursoriscreated,4=whenaqueryisexecuted,7=always
host='127.0.0.1',
port=3306,
user='root',
password='123',
database='pooldb',
charset='utf8'
)
deffunc():
#检测当前正在运行连接数的是否小于链接数,如果不小于则:等待或报raiseTooManyConnections异常
#否则
#则优先去初始化时创建的链接中获取链接SteadyDBConnection。
#然后将SteadyDBConnection对象封装到PooledDedicatedDBConnection中并返回。
#如果最开始创建的链接没有链接,则去创建一个SteadyDBConnection对象,再封装到PooledDedicatedDBConnection中并返回。
#一旦关闭链接后,连接就返回到连接池让后续线程继续使用。
conn=POOL.connection()
#print(th,'链接被拿走了',conn1._con)
#print(th,'池子里目前有',pool._idle_cache,'\r\n')
cursor=conn.cursor()
cursor.execute('select*fromtb1')
result=cursor.fetchall()
conn.close()
func()如果没有连接池,使用pymysql来连接数据库时,单线程应用完全没有问题,但如果涉及到多线程应用那么就需要加锁,一旦加锁那么连接势必就会排队等待,当请求比较多时,性能就会降低了。
importpymysqlimportthreading
fromthreadingimportRLock
LOCK=RLock()
CONN=pymysql.connect(host='127.0.0.1',
port=3306,
user='root',
password='123',
database='pooldb',
charset='utf8')
deftask(arg):
withLOCK:
cursor=CONN.cursor()
cursor.execute('select*fromtb1')
result=cursor.fetchall()
cursor.close()
print(result)
foriinrange(10):
t=threading.Thread(target=task,args=(i,))
t.start()
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。