北外新闻行业门户网站建设网站打开空白页面

当前位置: 首页 > news >正文

北外新闻行业门户网站建设,网站打开空白页面,广东网站制作设计,移动互联网网站建设目录10.数据库连接池模式一模式二示例#xff1a;使用数据库连接池进行登录验证10.数据库连接池 参考#xff1a;https://www.cnblogs.com/wangkun122/articles/8992637.html 通过DBUtils实现数据库连接池 安装#xff1a; pip install DBUtils1.2注意#xff1a;pytho… 目录10.数据库连接池模式一模式二示例使用数据库连接池进行登录验证10.数据库连接池 参考https://www.cnblogs.com/wangkun122/articles/8992637.html 通过DBUtils实现数据库连接池 安装 pip install DBUtils1.2注意python3现在回安装最新2.0版本的from DBUtils.PersistentDB import PersistentDB这样导入时会找不到模块要安装低版本到1.2版本。 模式一 为每个线程创建一个连接线程即使调用了close方法也不会关闭只是把连接重新放到连接池供自己线程再次使用。当线程终止时连接自动关闭 。 from DBUtils.PersistentDB import PersistentDB import pymysql POOL PersistentDB(creatorpymysql, # 使用链接数据库的模块maxusageNone, # 一个链接最多被重复使用的次数None表示无限制setsession[], # 开始会话前执行的命令列表。如[set datestyle to …, set time zone …]ping0,# ping MySQL服务端检查是否服务可用。# 如0 None never, 1 default whenever it is requested, 2 when a cursor is created, 4 when a query is executed, 7 alwayscloseableFalse,# 如果为False时 conn.close() 实际上被忽略供下次使用再线程关闭时才会自动关闭链接。如果为True时 conn.close()则关闭链接那么再次调用pool.connection时就会报错因为已经真的关闭了连接pool.steady_connection()可以获取一个新的链接threadlocalNone, # 本线程独享值得对象用于保存链接对象如果链接对象被重置host127.0.0.1,port3306,userroot,password123,databasepooldb,charsetutf8 )def func():conn POOL.connection(shareableFalse)cursor conn.cursor()cursor.execute(select * from tb1)result cursor.fetchall()cursor.close() #这里的关闭没有真正的关闭了线程在使用的话还是使用的那一个链接conn.close()func()模式二 创建一批连接到连接池供所有线程共享使用。 由于pymysql、MySQLdb等threadsafety值为1所以该模式连接池中的线程会被所有线程共享。 import pymysqlfrom DBUtils.PooledDB import PooledDB PYMYSQL_POOL PooledDB(creatorpymysql, # 使用链接数据库的模块maxconnections6, # 连接池允许的最大连接数0和None表示不限制连接数mincached2, # 初始化时链接池中至少创建的空闲的链接0表示不创建maxcached5, # 链接池中最多闲置的链接0和None不限制maxshared3, #这个参数没多大用 最大可以被大家共享的链接# 链接池中最多共享的链接数量0和None表示全部共享。PS: 无用因为pymysql和MySQLdb等模块的 threadsafety都为1所有值无论设置为多少_maxcached永远为0所以永远是所有链接都共享。blockingTrue, # 连接池中如果没有可用连接后是否阻塞等待。True等待False不等待然后报错maxusageNone, # 一个链接最多被重复使用的次数None表示无限制setsession[], # 开始会话前执行的命令列表。如[set datestyle to …, set time zone …]ping0,# ping MySQL服务端检查是否服务可用。# 如0 None never, 1 default whenever it is requested, 2 when a cursor is created, 4 when a query is executed, 7 alwayshost127.0.0.1,port3306,userroot,password123456,databases8day127db,#链接的数据库的名字charsetutf8)def func():# 检测当前正在运行连接数的是否小于最大链接数如果不小于则等待或报raise TooManyConnections异常# 否则# 则优先去初始化时创建的链接中获取链接 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 * from tb1)result cursor.fetchall()conn.close() #这里的关闭也没有彻底关闭而是将线程放回数据库连接池中去了func()示例使用数据库连接池进行登录验证 首先把数据库连接池放进配置文件 settings.py from datetime import timedelta from redis import Redis from DBUtils.PooledDB import PooledDB import pymysqlclass Config():DEBUG TrueSECRET_KEY AKL;FGMASDFASPERMANENT_SESSION_LIFETIME timedelta(minutes20)SESSION_REFRESH_EACH_REQUEST True # 是否应该为每一个请求设置cookie默认为True如果为False则必须显性调用set_cookie函数SESSION_TYPE redis # 使用redis存储sessionPYMYSQL_POOL PooledDB(creatorpymysql, # 使用链接数据库的模块maxconnections6, # 连接池允许的最大连接数0和None表示不限制连接数mincached2, # 初始化时链接池中至少创建的空闲的链接0表示不创建maxcached5, # 链接池中最多闲置的链接0和None不限制maxshared3, # 这个参数没多大用 最大可以被大家共享的链接blockingTrue,maxusageNone, # 一个链接最多被重复使用的次数None表示无限制setsession[], ping0,host127.0.0.1,port3306,userroot,password123456,databaseflask01, # 链接的数据库的名字charsetutf8)class ProductionConfig(Config):SESSION_REDIS Redis(host127.0.0.1, port6379)class DevelopmentConfig(Config):SESSION_REDIS Redis(host127.0.0.1, port6379)class TestConfig(Config):passsql_helper.py 使用数据库连接池 import pymysql from flask import current_appclass SQLHelper():staticmethoddef open():POOL current_app.config[PYMYSQL_POOL]conn POOL.connection()cursor conn.cursor(cursorpymysql.cursors.DictCursor)return conn, cursorstaticmethoddef close(conn, cursor):conn.commit()cursor.close()conn.close()classmethoddef fetch_one(cls, sql, args):conn, cursor cls.open()cursor.execute(sql, args)obj cursor.fetchone()cls.close(conn, cursor)return objclassmethoddef fetch_all(cls, sql, args):conn, cursor cls.open()cursor.execute(sql, args)obj cursor.fetchall()cls.close(conn, cursor)return objaccount.py 登录验证 from flask import Blueprint, request, render_template, session, redirect from uuid import uuid4 from ..utils.sql_helper import SQLHelperac Blueprint(ac, name)ac.route(/login, methods[GET, POST]) def login():if request.method GET:return render_template(login.html)user request.form.get(user)pwd request.form.get(pwd)# 数据库中查询数据obj SQLHelper.fetch_one(select id,name from users where name%s and pwd%s, [user, pwd])if user admin and pwd 123:uid str(uuid4())session.permanent Truesession[user_info] {id:obj[id], name:user}return redirect(/index)else:return render_template(login.html, msg用户名或密码错误)ac.route(/index) def logout():return welcome