MariaDB连接池connection_count与pool_size区别及已用连接查询方法
查看MariaDB Python连接池已使用连接数的方法
首先明确:MariaDB Connector/Python里的connection_count属性指的是连接池中的总连接数,并非已借出(正在使用)的连接数。所以它和pool_size始终相等是正常行为——初始化连接池时,就会创建指定数量的连接并放入池中。
要跟踪已使用的连接数、避免连接耗尽,有以下几种可行方案:
手动维护进程安全的计数器
多进程环境下内存不共享,需用进程安全的共享变量来跟踪连接的借出与归还:from multiprocessing import Manager, Process import mariadb from mariadb import ConnectionPool def worker(used_connections): pool = ConnectionPool(pool_name="mypool", pool_size=5, user="your_user", password="your_pass", host="localhost", database="your_db") with pool.get_connection() as conn: used_connections.value += 1 print(f"当前已使用连接数: {used_connections.value}") # 执行数据库操作... # with块结束后连接自动归还,计数器减1 used_connections.value -= 1 if __name__ == "__main__": with Manager() as manager: used_connections = manager.Value('i', 0) processes = [Process(target=worker, args=(used_connections,)) for _ in range(5)] for p in processes: p.start() for p in processes: p.join()核心是确保连接归还时计数器同步减少,用
with语句能避免异常导致的连接泄漏。从数据库端查询真实连接数
直接执行MariaDB的SHOW PROCESSLIST语句,过滤出当前应用的连接:def get_current_used_connections(pool): with pool.get_connection() as conn: cursor = conn.cursor() cursor.execute("SHOW PROCESSLIST") # 根据你的应用连接信息过滤,比如匹配用户名、客户端主机 used_count = sum(1 for row in cursor if row[2] == "your_user" and row[1].startswith("127.0.0.1:")) cursor.close() return used_count这个方法能拿到数据库端的真实连接数,但需要确保当前数据库用户拥有
PROCESS权限,且过滤条件要准确匹配你的应用连接。优先用
with语句管理连接
不管用哪种跟踪方式,避免连接耗尽的核心是确保连接被正确归还。使用with语句获取连接,能保证即使代码抛出异常,连接也会自动归还到池中,从根源上减少连接泄漏的可能:with pool.get_connection() as conn: # 执行查询、更新等操作 cursor = conn.cursor() cursor.execute("SELECT * FROM your_table") # 处理结果...
内容的提问来源于stack exchange,提问作者solick
相关产品推荐
相关产品推荐

