From d2e7ca8976cfe03e068497682325a794594dde15 Mon Sep 17 00:00:00 2001 From: liuwei Date: Wed, 19 Mar 2025 09:55:08 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E5=99=A8=E5=8D=95=E4=BE=8B=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/connection.py | 51 +++++++++++++-------- game_task/game_task_encyclopedia.py | 2 +- message_sign/main.py | 2 +- message_storage/message_to_db.py | 2 +- plugins/stats_collector/main.py | 2 +- plugins/stats_dashboard/dashboard_server.py | 2 +- robot.py | 5 +- 7 files changed, 41 insertions(+), 25 deletions(-) diff --git a/db/connection.py b/db/connection.py index 5ddb81b..b5301d2 100644 --- a/db/connection.py +++ b/db/connection.py @@ -6,38 +6,53 @@ from typing import Optional class DBConnectionManager: - """数据库连接管理类,用于管理MySQL和Redis连接池""" + """数据库连接管理器,负责管理MySQL和Redis连接池""" _instance = None - def __new__(cls, *args, **kwargs): + @classmethod + def get_instance(cls, mysql_config=None, redis_config=None): + """获取单例实例 + + Args: + mysql_config: MySQL配置 + redis_config: Redis配置 + + Returns: + DBConnectionManager实例 + """ if cls._instance is None: - cls._instance = super(DBConnectionManager, cls).__new__(cls) - cls._instance.initialized = False + cls._instance = cls(mysql_config, redis_config) + elif mysql_config or redis_config: + # 如果已经有实例但又传入了配置,则更新配置 + if mysql_config and not cls._instance.mysql_pool: + cls._instance.init_mysql_pool(mysql_config) + if redis_config and not cls._instance.redis_pool: + cls._instance.init_redis_pool(redis_config) return cls._instance - def __init__(self, mysql_config: Optional[dict] = None, redis_config: Optional[dict] = None): - if self.initialized: + def __init__(self, mysql_config=None, redis_config=None): + """初始化数据库连接管理器 + + Args: + mysql_config: MySQL配置 + redis_config: Redis配置 + """ + # 防止直接实例化 + if DBConnectionManager._instance is not None: return - self.LOG = logging.getLogger("DBConnectionManager") + self.mysql_pool = None + self.redis_pool = None # 初始化MySQL连接池 if mysql_config: - self.mysql_pool = mysql.connector.pooling.MySQLConnectionPool(**mysql_config) - self.LOG.info(f"MySQL连接池初始化完成: {mysql_config}") - else: - self.mysql_pool = None - + self.init_mysql_pool(mysql_config) + # 初始化Redis连接池 if redis_config: - self.redis_pool = redis.ConnectionPool(**redis_config) - self.LOG.info(f"Redis连接池初始化完成: {redis_config}") - else: - self.redis_pool = None + self.init_redis_pool(redis_config) - self.initialized = True - def get_mysql_connection(self): """获取MySQL连接""" if not self.mysql_pool: diff --git a/game_task/game_task_encyclopedia.py b/game_task/game_task_encyclopedia.py index 4380934..1a9a337 100644 --- a/game_task/game_task_encyclopedia.py +++ b/game_task/game_task_encyclopedia.py @@ -7,7 +7,7 @@ from db.connection import DBConnectionManager from db.encyclopedia import EncyclopediaDB # 获取数据库连接管理器的单例 -db_manager = DBConnectionManager() +db_manager = DBConnectionManager.get_instance() encyclopedia_db = EncyclopediaDB(db_manager) diff --git a/message_sign/main.py b/message_sign/main.py index 06085fe..a011c9a 100644 --- a/message_sign/main.py +++ b/message_sign/main.py @@ -50,7 +50,7 @@ class SignInSystem: self.all_contacts = all_contacts # 初始化数据库连接管理器 - self.db_manager = DBConnectionManager() + self.db_manager = DBConnectionManager.get_instance() # 初始化数据库操作类 self.sign_in_db = SignInDB(self.db_manager) self.sign_in_redis = SignInRedisDB(self.db_manager) diff --git a/message_storage/message_to_db.py b/message_storage/message_to_db.py index b5f3934..d869c51 100644 --- a/message_storage/message_to_db.py +++ b/message_storage/message_to_db.py @@ -20,7 +20,7 @@ class MessageStorage: def __init__(self): # 获取数据库连接管理器的单例 - self.db_manager = DBConnectionManager() + self.db_manager = DBConnectionManager.get_instance() self.message_db = MessageStorageDB(self.db_manager) # 初始化本地缓存字典,使用 group_id 作为键 self.local_membercounts = {} diff --git a/plugins/stats_collector/main.py b/plugins/stats_collector/main.py index 23fdbc3..6278edd 100644 --- a/plugins/stats_collector/main.py +++ b/plugins/stats_collector/main.py @@ -51,7 +51,7 @@ class StatsCollectorPlugin(PluginInterface): } self.event_manager = EventManager.get_instance() - self.db_manager = DBConnectionManager() + self.db_manager = DBConnectionManager.get_instance() self.stats_db = StatsDBOperator(self.db_manager) def initialize(self, config: Dict[str, Any]) -> bool: diff --git a/plugins/stats_dashboard/dashboard_server.py b/plugins/stats_dashboard/dashboard_server.py index 75e8b46..0248c50 100644 --- a/plugins/stats_dashboard/dashboard_server.py +++ b/plugins/stats_dashboard/dashboard_server.py @@ -21,7 +21,7 @@ class DashboardServer: self.logger = logging.getLogger("DashboardServer") # 修正:使用单例模式获取数据库连接 - self.db_manager = DBConnectionManager() + self.db_manager = DBConnectionManager.get_instance() self.stats_db = StatsDBOperator(self.db_manager) self.app = self._create_app() self._stop_event = threading.Event() diff --git a/robot.py b/robot.py index ef2c2f5..d092d27 100644 --- a/robot.py +++ b/robot.py @@ -74,9 +74,10 @@ class Robot(Job): self.wxid = self.wcf.get_self_wxid() self.allContacts = self.get_all_contacts() + # 修改初始化方法中的这一部分 self.LOG.info(f"DB+REDIS 连接池开始初始化") - # 初始化数据库连接管理器 - self.db_manager = DBConnectionManager( + # 使用单例模式获取实例 + self.db_manager = DBConnectionManager.get_instance( mysql_config=self.config.mariadb, redis_config=self.config.redis )