数据库连接池

pymsql链接数据库

  1. import pymysql
  2. conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456', db='s8day127db')
  3. cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
  4. # cursor.execute("select id,name from users where name=%s and pwd=%s",['lqz','123',])
  5. cursor.execute("select id,name from users where name=%(user)s and pwd=%(pwd)s",{'user':'lqz','pwd':'123'})
  6. obj = cursor.fetchone()
  7. conn.commit()
  8. cursor.close()
  9. conn.close()
  10. print(obj)

数据库连接池版

方式一

为每个线程创建一个连接,线程即使调用了close方法,也不会关闭,只是把连接重新放到连接池,供自己线程再次使用。当线程终止时,连接自动关闭

  1. from DBUtils.PersistentDB import PersistentDB
  2. import pymysql
  3. POOL = PersistentDB(
  4. creator=pymysql, # 使用链接数据库的模块
  5. maxusage=None, # 一个链接最多被重复使用的次数,None表示无限制
  6. setsession=[], # 开始会话前执行的命令列表。
  7. ping=0,
  8. # ping MySQL服务端,检查是否服务可用。
  9. closeable=False,
  10. # 如果为False时, conn.close() 实际上被忽略,供下次使用,再线程关闭时,才会自动关闭链接。如果为True时, conn.close()则关闭链接,那么再次调用pool.connection时就会报错,因为已经真的关闭了连接(pool.steady_connection()可以获取一个新的链接)
  11. threadlocal=None, # 本线程独享值得对象,用于保存链接对象,如果链接对象被重置
  12. host='127.0.0.1',
  13. port=3306,
  14. user='root',
  15. password='123456',
  16. database='test',
  17. charset='utf8'
  18. )
  19. def func():
  20. conn = POOL.connection(shareable=False)
  21. cursor = conn.cursor()
  22. cursor.execute('select * from user')
  23. result = cursor.fetchall()
  24. print(result)
  25. cursor.close()
  26. conn.close()
  27. if __name__ == '__main__':
  28. func()

方式二

创建一批连接到连接池,供所有线程共享使用

setting.py

  1. from datetime import timedelta
  2. from redis import Redis
  3. import pymysql
  4. from DBUtils.PooledDB import PooledDB, SharedDBConnection
  5. class Config(object):
  6. DEBUG = True
  7. SECRET_KEY = "umsuldfsdflskjdf"
  8. PERMANENT_SESSION_LIFETIME = timedelta(minutes=20)
  9. SESSION_REFRESH_EACH_REQUEST= True
  10. SESSION_TYPE = "redis"
  11. PYMYSQL_POOL = PooledDB(
  12. creator=pymysql, # 使用链接数据库的模块
  13. maxconnections=6, # 连接池允许的最大连接数,0和None表示不限制连接数
  14. mincached=2, # 初始化时,链接池中至少创建的空闲的链接,0表示不创建
  15. maxcached=5, # 链接池中最多闲置的链接,0和None不限制
  16. maxshared=3,
  17. # 链接池中最多共享的链接数量,0和None表示全部共享。PS: 无用,因为pymysql和MySQLdb等模块的 threadsafety都为1,所有值无论设置为多少,_maxcached永远为0,所以永远是所有链接都共享。
  18. blocking=True, # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错
  19. maxusage=None, # 一个链接最多被重复使用的次数,None表示无限制
  20. setsession=[], # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."]
  21. ping=0,
  22. # 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
  23. host='127.0.0.1',
  24. port=3306,
  25. user='root',
  26. password='123456',
  27. database='s8day127db',
  28. charset='utf8'
  29. )
  30. class ProductionConfig(Config):
  31. SESSION_REDIS = Redis(host='192.168.0.94', port='6379')
  32. class DevelopmentConfig(Config):
  33. SESSION_REDIS = Redis(host='127.0.0.1', port='6379')
  34. class TestingConfig(Config):
  35. pass

utils/sql.py

  1. import pymysql
  2. from settings import Config
  3. class SQLHelper(object):
  4. @staticmethod
  5. def open(cursor):
  6. POOL = Config.PYMYSQL_POOL
  7. conn = POOL.connection()
  8. cursor = conn.cursor(cursor=cursor)
  9. return conn,cursor
  10. @staticmethod
  11. def close(conn,cursor):
  12. conn.commit()
  13. cursor.close()
  14. conn.close()
  15. @classmethod
  16. def fetch_one(cls,sql,args,cursor =pymysql.cursors.DictCursor):
  17. conn,cursor = cls.open(cursor)
  18. cursor.execute(sql, args)
  19. obj = cursor.fetchone()
  20. cls.close(conn,cursor)
  21. return obj
  22. @classmethod
  23. def fetch_all(cls,sql, args,cursor =pymysql.cursors.DictCursor):
  24. conn, cursor = cls.open(cursor)
  25. cursor.execute(sql, args)
  26. obj = cursor.fetchall()
  27. cls.close(conn, cursor)
  28. return obj

使用:

  1. obj = SQLHelper.fetch_one("select id,name from users where name=%(user)s and pwd=%(pwd)s", form.data)

Flask--数据库连接池的更多相关文章

  1. flask数据库连接池DBUtils

    数据库连接池 为啥要使用数据库连接池 频繁的连接和断开数据库,消耗大,效率低 DBUtils可以创建多个线程连接数据库,且一直保持连接,不会断开 执行数据库操作时,由数据池分配线程,当数据池空时,可选 ...

  2. Python Flask数据库连接池

    1. 安装pymysql pip3 install pymysql 2. 安装dbutils开源工具库 pip3 install dbutils 3. 模式一: from DBUtils.Persis ...

  3. 3、flask之基于DBUtils实现数据库连接池、本地线程、上下文

    本篇导航: 数据库连接池 本地线程 上下文管理 面向对象部分知识点解析 1.子类继承父类__init__的三种方式 class Dog(Animal): #子类 派生类 def __init__(se ...

  4. Flask请求扩展和数据库连接池

    1.1.Flask之请求扩展 #!/usr/bin/env python # -*- coding:utf-8 -*- from flask import Flask, Request, render ...

  5. Flask中使用数据库连接池 DBUtils ——(4)

    DBUtils是Python的一个用于实现数据库连接池的模块. 此连接池有两种连接模式: 模式一:为每个线程创建一个连接,线程即使调用了close方法,也不会关闭,只是把连接重新放到连接池,供自己线程 ...

  6. flask之基于DBUtils实现数据库连接池、本地线程、上下文

    本篇导航: 数据库连接池 本地线程 上下文管理 面向对象部分知识点解析 1.子类继承父类__init__的三种方式 class Dog(Animal): #子类 派生类 def __init__(se ...

  7. flask框架----数据库连接池

    数据库连接池 flask中是没有ORM的,如果在flask里面连接数据库有两种方式 一:pymysql 二:SQLAlchemy 是python 操作数据库的一个库.能够进行 orm 映射官方文档 s ...

  8. Flask学习【第3篇】:蓝图、基于DBUtils实现数据库连接池、上下文管理等

    小知识 子类继承父类的三种方式 class Dog(Animal): #子类 派生类 def __init__(self,name,breed, life_value,aggr): # Animal. ...

  9. Flask的数据库连接池 DBUtils

    Flask是没有ORM的操作的,如果在flask中连接数据库有两种方式 一.pymysql 二.SQLAlchemy 是python操作数据库的以一个库,能够进行orm映射官网文档 sqlchemy ...

  10. Flask系列(三)蓝图、基于DButils实现数据库连接池、上下文管理

    知识点回顾 1.子类继承父类的三种方式 class Dog(Animal): #子类 派生类 def __init__(self,name,breed, life_value,aggr): # Ani ...

随机推荐

  1. Linux下正确修改Docker镜像和容器的默认存储位置,亲测有效

    我们通过 yum 的方式安装完Docker环境后,它默认的存储位置是 /var/lib/docker,默认的 pid 存放位置是 /var/run/docker.pid. 如果仅仅是做测试,我们可能没 ...

  2. 移动OA办公——Smobiler第一个开源应用解决方案,快来get吧

    产品简介 SmoONE是一款移动OA类的开源解决方案,通过Smobiler平台开发,包含了注册.登陆.用户信息等基本功能.集成了OA中使用场景较多的报销.请假.部门管理.成本中心等核心功能. 免费获取 ...

  3. cpu 乱序执行与问题【转】

    转自:https://blog.csdn.net/lizhihaoweiwei/article/details/50562732 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议 ...

  4. 01-Django 简介

    一.MVC框架(模型-视图-控制器缩写,软件的构建模式) 一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需 ...

  5. 九、Swift对象存储服务(双节点搭建)

    九.Swift对象存储服务(双节点搭建) 要求:Controoler节点需要2块空盘 Compute节点需要再加2块空盘 本次搭建采用Controller 和 Compute双节点节点做swift组件 ...

  6. 【BZOJ2655】calc(拉格朗日插值)

    bzoj 题意: 给出\(n\),现在要生成这\(n\)个数,每个数有一个值域\([1,A]\).同时要求这\(n\)个数两两不相同. 问一共有多少种方案. 思路: 因为\(A\)很大,同时随着值域的 ...

  7. 扎西平措 201571030332 《面向对象程序设计 (JAVA)》第二周 学习总结

    面向对象程序设计 (JAVA)>第二周 学习总结 项目 内容 这个作业属于哪个课程 <任课教师博客主页链接>https://www.cnblogs.com/nwnu-daizh/ 这 ...

  8. idea之前的版本

    https://www.jetbrains.com/idea/download/previous.html

  9. 《滴滴自研分布式 NoSQL 数据库 Fusion 的演进之路》

    SSD:采用闪存: 读的速度很快:写入数据时,因为需要通过加压的方式对存储单元进行电子填充,所以速度略慢:擦除速度最慢,擦除块的时间在ms级.在使用SSD的时,需要考虑到SSD的读写不平衡的特性. 滴 ...

  10. Python进阶-XVI 继承 单继承 多继承

    一.初识继承 1.引入继承 class A(object): pass # 父类,基类,超类 class B: pass # 父类,基类,超类 class A_son(A, B): pass # 子类 ...