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

企业网站建设机构网站建设视频

企业网站建设机构,网站建设视频,php成品网站下载,24小时资源更新观看免费视频数据库连接池单例模式 1. 为什么使用单例模式 创建数据库连接是一个昂贵的过程(涉及网络通信、认证等)。单例模式的连接池可以在程序启动时初始化一组连接,并在整个生命周期中重用这些连接,而不是每次请求都新建连接。同时还可…

数据库连接池单例模式
 

1. 为什么使用单例模式

创建数据库连接是一个昂贵的过程(涉及网络通信、认证等)。单例模式的连接池可以在程序启动时初始化一组连接,并在整个生命周期中重用这些连接,而不是每次请求都新建连接。同时还可以控制连接数量,防止资源耗尽。


2.代码

下面这段代码实现了一个数据库连接池,并且通过单例模式确保整个程序中只有一个连接池实例,包含扩容机制。避免频繁创建和销毁数据库连接,通过单例复用连接池:

通过单例模式确保全局只有一个连接池实例。
使用线程锁和条件变量实现线程安全,处理多线程环境下的并发访问。
提供连接的创建、获取、归还和关闭功能。
通过多线程测试验证连接池的并发性能。

import pymysql
import threading
from pymysql import Errorclass DatabasePool:_instance = Nonedef __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 = 10cls._instance.connections = []  # 未使用的连接cls._instance.in_use = set()   # 正在使用的连接cls._instance.init_pool()return cls._instance    # 返回唯一的连接池实例def init_pool(self):"""初始化连接池(线程安全)"""with self.lock:for _ in range(self.max_connections):self.add_connection()def create_connection(self):"""创建单个数据库连接(无需加锁)"""try:conn = pymysql.connect(**self.config)print(f"成功创建连接:{conn._sock.getsockname()}")return connexcept Error as e:print(f"连接创建失败: {e}")return Nonedef add_connection(self):"""向连接池添加连接(线程安全)"""if len(self.connections) + len(self.in_use) < self.max_connections:conn = self.create_connection()if conn:self.connections.append(conn)def get_connection(self):"""获取连接(线程安全)"""with self.condition:while not self.connections:if len(self.in_use) < self.max_connections:self.add_connection()else:print("连接池已满,等待连接归还...")self.condition.wait()  # 等待连接归还conn = self.connections.pop()self.in_use.add(conn)print(f"获取连接:{conn._sock.getsockname()}")return conndef release_connection(self, conn):"""归还连接(线程安全)"""with self.condition:if conn in self.in_use:self.in_use.remove(conn)if conn.open:self.connections.append(conn)print(f"归还连接:{conn._sock.getsockname()}")self.condition.notify()  # 通知等待的线程else:print("警告:连接已关闭,直接丢弃")def close_pool(self):"""关闭所有连接(线程安全)"""with self.lock:for conn in self.connections + list(self.in_use):if conn.open:conn.close()self.connections.clear()self.in_use.clear()print("所有数据库连接已关闭")# 多线程测试示例
if __name__ == "__main__":import concurrent.futuresdef worker(thread_id):pool = DatabasePool()conn = pool.get_connection()try:with conn.cursor() as cursor:cursor.execute("SELECT SLEEP(1)")  # 模拟耗时操作print(f"线程 {thread_id} 执行查询")finally:pool.release_connection(conn)# 创建连接池pool = DatabasePool()# 使用15个线程并发测试,超过最大连接数with concurrent.futures.ThreadPoolExecutor(max_workers=15) as executor:futures = [executor.submit(worker, i) for i in range(15)]for future in concurrent.futures.as_completed(futures):future.result()pool.close_pool()

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 = 10cls._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支)。
  • 动态扩容:当铅笔用完时,管理员临时制作新铅笔。
  • 归还机制:用完后必须归还,否则其他人无法使用。
http://www.yayakq.cn/news/392796/

相关文章:

  • 二手房网站平台怎么做如何选网站建设公司
  • 网站建设优势网页设计优秀案例分析
  • 镇江网站建设活动方案注册资金必须实缴吗
  • 刚做网站做多用户还是单用户凡科建站官网页更换视频
  • 南通制作企业网站搜索引擎优化面对哪些困境
  • 谈谈对网站开发的理解官方网站建设 磐石网络知名
  • 如何更换网站后台网站后台数据库设计
  • 专业网站的建设设行吗国际新闻最新消息10条
  • 可以做幻灯片的网站科技成果转化平台
  • 怎么做私人彩票网站2345高级版
  • 网站主体变更可视化 网站开发工具
  • 物流做网站哪家好证书兼职网
  • 做宣传的网站有哪些山西公司响应式网站建设平台
  • 北京外包网站网站建设用什么技术
  • 广州做网站哪里好定远建设小学投诉网站
  • 安徽振兴集团网站开发加盟网站有哪些
  • 哪个网站做布料好wordpress font google
  • wordpress 网站名称免费建站软件哪个好
  • 网站网站营销特点网站建设实践收获
  • 百度收录率高的网站巴南区网站建设
  • 建设项目竣工验收网站软件营销网站
  • 如何免费做网站 详细点说辽宁建设工程信息网、
  • 手机主题制作网站网站建设与网络编辑综合实训课程指导手册pdf
  • 深圳网站制作哪里济南兴田德润简介定制类网站建设
  • 有哪些做网站的公司室内设计效果图 客厅
  • 网站建设与 维护实训报告范文沈阳企业制作网站
  • 建设通查询设通网站emlog怎么转换到WordPress
  • 上海网站建设设计公司哪家好做彩票网站模板
  • 网站的建设要多少钱网站后台从哪里进去
  • 做影视后期应该关注哪些网站网站托管哪家好