马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
数据库毗连池单例模式
1. 为什么使用单例模式
创建数据库毗连是一个昂贵的过程(涉及网络通讯、认证等)。单例模式的毗连池可以在步调启动时初始化一组毗连,并在整个生命周期中重用这些毗连,而不是每次哀求都新建毗连。同时还可以控制毗连数量,防止资源耗尽。
2.代码
下面这段代码实现了一个数据库毗连池,而且通过单例模式确保整个步调中只有一个毗连池实例,包罗扩容机制。克制频仍创建和烧毁数据库毗连,通过单例复用毗连池:
通过单例模式确保全局只有一个毗连池实例。
使用线程锁和条件变量实现线程安全,处置处罚多线程环境下的并发访问。
提供毗连的创建、获取、归还和关闭功能。
通过多线程测试验证毗连池的并发性能。3. 核心:__new__ 方法
- class DatabasePool:
- _instance = None # 类变量,用于保存唯一的实例
- def __new__(cls):
- if not cls._instance:
- cls._instance = super().__new__(cls)
- # 数据库配置
- cls._instance.config = {
- 'host': 'localhost',
- 'user': 'root',
- 'password': '111111',
- 'database': 'test',
- 'charset': 'utf8mb4',
- 'cursorclass': pymysql.cursors.DictCursor
- }
- # 使用可重入锁和条件变量
- cls._instance.lock = threading.RLock()
- cls._instance.condition = threading.Condition(cls._instance.lock)
- cls._instance.max_connections = 10
- cls._instance.connections = [] # 未使用的连接
- cls._instance.in_use = set() # 正在使用的连接
- cls._instance.init_pool()
- return cls._instance # 返回唯一的连接池实例
复制代码
- 作用:确保无论创建多少次 DatabasePool(),都只会天生同一个实例。
- 示例:
- pool1 = DatabasePool() # 第一次创建,初始化连接池
- pool2 = DatabasePool() # 直接返回 pool1 的实例
- print(pool1 is pool2) # 输出 True
复制代码 3. 总结
我们可以把毗连池想象成一个共享铅笔盒(全班共享):
- 锁:管理员(锁)确保一次只有一个人能拿铅笔。
- 毗连:铅笔盒里的铅笔(初始10支)。
- 动态扩容:当铅笔用完时,管理员临时制作新铅笔。
- 归还机制:用完后必须归还,否则其他人无法使用。
|