本指南介绍如何将现有的MySQL数据库连接改为使用连接池,以提高数据库访问性能和并发处理能力。
- 性能提升: 避免频繁创建和销毁连接的开销
- 并发支持: 支持多个线程同时访问数据库
- 资源管理: 自动管理连接的生命周期
- 故障恢复: 自动处理连接断开和重连
- 连接池状态监控
- 可配置的连接池大小
- 溢出连接管理
- 线程安全的连接获取和释放
database/
├── mysql_db.py # 原始MySQL数据库类
└── mysql_pool_db.py # 新的连接池版本
config/
├── database_config.py # 数据库配置管理
└── database_config.json # 数据库配置文件
test_mysql_pool.py # 连接池测试脚本
{
"host": "192.168.100.27",
"port": 3306,
"user": "zmonv",
"password": "rpa@2025",
"database": "test_zmonv_rpa",
"charset": "utf8mb4",
"pool_size": 10, // 连接池大小
"max_overflow": 5 // 最大溢出连接数
}- pool_size: 连接池中保持的连接数量(默认:10)
- max_overflow: 当连接池满时,允许创建的额外连接数(默认:5)
- 总连接数: pool_size + max_overflow
from database.mysql_pool_db import MySQLKeywordDBPool
from config.database_config import DatabaseConfig
# 加载配置
config = DatabaseConfig.load_config()
# 创建数据库实例(使用连接池)
db = MySQLKeywordDBPool(
config,
pool_size=10, # 连接池大小
max_overflow=5 # 最大溢出连接数
)
# 测试连接
if db.test_connection():
print("数据库连接成功")
# 查看连接池状态
pool_status = db.get_pool_status()
print(f"连接池状态: {pool_status}")
# 执行数据库操作
db.add_keyword("测试关键词", "test")
keywords = db.get_all_keywords()
# 关闭连接池
db.close()import threading
def worker(db, worker_id):
"""工作线程函数"""
for i in range(10):
# 每个线程可以安全地使用同一个数据库实例
db.add_keyword(f"关键词_{worker_id}_{i}", "test")
keywords = db.get_all_keywords()
# 创建多个线程
threads = []
for i in range(5):
thread = threading.Thread(target=worker, args=(db, i))
threads.append(thread)
thread.start()
# 等待所有线程完成
for thread in threads:
thread.join()# 获取连接池状态
pool_status = db.get_pool_status()
print(f"连接池状态: {pool_status}")
# 输出示例:
# {
# 'pool_size': 8, # 当前池中连接数
# 'max_pool_size': 10, # 最大池大小
# 'overflow_connections': 2, # 溢出连接数
# 'max_overflow': 5, # 最大溢出连接数
# 'total_connections': 10 # 总连接数
# }| 功能 | 原始版本 | 连接池版本 | 说明 |
|---|---|---|---|
| 连接管理 | 单连接 | 连接池 | 支持并发访问 |
| 性能 | 一般 | 更好 | 避免连接创建开销 |
| 线程安全 | 部分 | 完全 | 使用锁机制保证安全 |
| 状态监控 | 无 | 有 | 可监控连接池状态 |
| 配置 | 基础 | 增强 | 支持连接池参数 |
# 获取连接池状态
pool_status = db.get_pool_status()
# 设置连接池配置
db.set_connection_config(config, pool_size=15, max_overflow=10)# 根据应用需求调整连接池大小
# 轻量级应用
db = MySQLKeywordDBPool(config, pool_size=5, max_overflow=3)
# 中等负载应用
db = MySQLKeywordDBPool(config, pool_size=10, max_overflow=5)
# 高并发应用
db = MySQLKeywordDBPool(config, pool_size=20, max_overflow=10)- 合理设置连接池大小: 根据并发用户数和数据库性能调整
- 监控连接池状态: 定期检查连接池使用情况
- 及时关闭连接池: 应用结束时调用
close()方法 - 错误处理: 妥善处理数据库连接异常
python test_mysql_pool.py测试脚本包含:
- 基本功能测试
- 并发访问测试
- 性能对比测试
==================================================
测试基本功能
==================================================
✓ 数据库连接成功
✓ 连接池状态: {'pool_size': 10, 'max_pool_size': 10, 'overflow_connections': 0, 'max_overflow': 5, 'total_connections': 10}
✓ 添加关键词成功
✓ 查询到 1 个关键词
✓ 统计信息: {'total_keywords': 1, 'keywords_by_type': {'test': 1}, 'total_detections': 0, 'today_detections': 0}
✓ 清理测试数据完成
✓ 连接池已关闭
-
更新导入语句:
# 原始版本 from database.mysql_db import MySQLKeywordDB # 连接池版本 from database.mysql_pool_db import MySQLKeywordDBPool
-
更新实例化代码:
# 原始版本 db = MySQLKeywordDB(config) # 连接池版本 db = MySQLKeywordDBPool(config, pool_size=10, max_overflow=5)
-
添加连接池状态监控:
# 新增功能 pool_status = db.get_pool_status() print(f"连接池状态: {pool_status}")
-
确保正确关闭连接池:
# 应用结束时 db.close()
-
连接池已满错误
- 增加
pool_size或max_overflow参数 - 检查是否有连接泄漏
- 增加
-
连接超时
- 检查数据库服务器状态
- 调整连接超时参数
-
性能问题
- 监控连接池使用情况
- 根据实际负载调整连接池大小
# 启用详细日志
import logging
logging.basicConfig(level=logging.DEBUG)
# 监控连接池状态
def monitor_pool(db):
while True:
status = db.get_pool_status()
print(f"连接池状态: {status}")
time.sleep(5)
# 在单独线程中运行监控
monitor_thread = threading.Thread(target=monitor_pool, args=(db,))
monitor_thread.daemon = True
monitor_thread.start()MySQL连接池版本提供了更好的性能、并发支持和资源管理能力。通过合理配置连接池参数,可以显著提升应用的数据库访问性能。建议在生产环境中使用连接池版本,并根据实际负载情况进行调优。