数据库管理器单例模式

This commit is contained in:
liuwei
2025-03-19 09:55:08 +08:00
parent 85d3f06baf
commit d2e7ca8976
7 changed files with 41 additions and 25 deletions

View File

@@ -6,37 +6,52 @@ from typing import Optional
class DBConnectionManager: class DBConnectionManager:
"""数据库连接管理类,用于管理MySQL和Redis连接池""" """数据库连接管理器,负责管理MySQL和Redis连接池"""
_instance = None _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: if cls._instance is None:
cls._instance = super(DBConnectionManager, cls).__new__(cls) cls._instance = cls(mysql_config, redis_config)
cls._instance.initialized = False 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 return cls._instance
def __init__(self, mysql_config: Optional[dict] = None, redis_config: Optional[dict] = None): def __init__(self, mysql_config=None, redis_config=None):
if self.initialized: """初始化数据库连接管理器
Args:
mysql_config: MySQL配置
redis_config: Redis配置
"""
# 防止直接实例化
if DBConnectionManager._instance is not None:
return return
self.LOG = logging.getLogger("DBConnectionManager") self.mysql_pool = None
self.redis_pool = None
# 初始化MySQL连接池 # 初始化MySQL连接池
if mysql_config: if mysql_config:
self.mysql_pool = mysql.connector.pooling.MySQLConnectionPool(**mysql_config) self.init_mysql_pool(mysql_config)
self.LOG.info(f"MySQL连接池初始化完成: {mysql_config}")
else:
self.mysql_pool = None
# 初始化Redis连接池 # 初始化Redis连接池
if redis_config: if redis_config:
self.redis_pool = redis.ConnectionPool(**redis_config) self.init_redis_pool(redis_config)
self.LOG.info(f"Redis连接池初始化完成: {redis_config}")
else:
self.redis_pool = None
self.initialized = True
def get_mysql_connection(self): def get_mysql_connection(self):
"""获取MySQL连接""" """获取MySQL连接"""

View File

@@ -7,7 +7,7 @@ from db.connection import DBConnectionManager
from db.encyclopedia import EncyclopediaDB from db.encyclopedia import EncyclopediaDB
# 获取数据库连接管理器的单例 # 获取数据库连接管理器的单例
db_manager = DBConnectionManager() db_manager = DBConnectionManager.get_instance()
encyclopedia_db = EncyclopediaDB(db_manager) encyclopedia_db = EncyclopediaDB(db_manager)

View File

@@ -50,7 +50,7 @@ class SignInSystem:
self.all_contacts = all_contacts 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_db = SignInDB(self.db_manager)
self.sign_in_redis = SignInRedisDB(self.db_manager) self.sign_in_redis = SignInRedisDB(self.db_manager)

View File

@@ -20,7 +20,7 @@ class MessageStorage:
def __init__(self): def __init__(self):
# 获取数据库连接管理器的单例 # 获取数据库连接管理器的单例
self.db_manager = DBConnectionManager() self.db_manager = DBConnectionManager.get_instance()
self.message_db = MessageStorageDB(self.db_manager) self.message_db = MessageStorageDB(self.db_manager)
# 初始化本地缓存字典,使用 group_id 作为键 # 初始化本地缓存字典,使用 group_id 作为键
self.local_membercounts = {} self.local_membercounts = {}

View File

@@ -51,7 +51,7 @@ class StatsCollectorPlugin(PluginInterface):
} }
self.event_manager = EventManager.get_instance() self.event_manager = EventManager.get_instance()
self.db_manager = DBConnectionManager() self.db_manager = DBConnectionManager.get_instance()
self.stats_db = StatsDBOperator(self.db_manager) self.stats_db = StatsDBOperator(self.db_manager)
def initialize(self, config: Dict[str, Any]) -> bool: def initialize(self, config: Dict[str, Any]) -> bool:

View File

@@ -21,7 +21,7 @@ class DashboardServer:
self.logger = logging.getLogger("DashboardServer") self.logger = logging.getLogger("DashboardServer")
# 修正:使用单例模式获取数据库连接 # 修正:使用单例模式获取数据库连接
self.db_manager = DBConnectionManager() self.db_manager = DBConnectionManager.get_instance()
self.stats_db = StatsDBOperator(self.db_manager) self.stats_db = StatsDBOperator(self.db_manager)
self.app = self._create_app() self.app = self._create_app()
self._stop_event = threading.Event() self._stop_event = threading.Event()

View File

@@ -74,9 +74,10 @@ class Robot(Job):
self.wxid = self.wcf.get_self_wxid() self.wxid = self.wcf.get_self_wxid()
self.allContacts = self.get_all_contacts() self.allContacts = self.get_all_contacts()
# 修改初始化方法中的这一部分
self.LOG.info(f"DB+REDIS 连接池开始初始化") self.LOG.info(f"DB+REDIS 连接池开始初始化")
# 初始化数据库连接管理器 # 使用单例模式获取实例
self.db_manager = DBConnectionManager( self.db_manager = DBConnectionManager.get_instance(
mysql_config=self.config.mariadb, mysql_config=self.config.mariadb,
redis_config=self.config.redis redis_config=self.config.redis
) )