面试题答案
一键面试使用DBUtils实现PyMySQL连接池
- 安装依赖:
pip install dbutils pymysql
- 代码示例:
from dbutils.pooled_db import PooledDB import pymysql # 创建连接池 pool = PooledDB( creator=pymysql, # 使用pymysql作为数据库连接创建者 host='localhost', user='root', password='password', database='test', port=3306, autocommit=True, maxconnections=10, # 最大连接数 blocking=True # 当连接池满时,是否阻塞等待新连接 ) def get_data(): # 从连接池获取连接 conn = pool.connection() try: with conn.cursor() as cursor: sql = "SELECT * FROM your_table" cursor.execute(sql) result = cursor.fetchall() return result finally: # 归还连接到连接池 conn.close()
连接池工作原理
- 初始化:连接池在启动时创建一定数量的数据库连接,并将这些连接放入一个空闲连接队列中。
- 请求连接:当应用程序需要连接数据库时,从连接池的空闲连接队列中获取一个连接。如果队列中有空闲连接,则直接返回;如果没有,则根据配置(如是否阻塞等待)处理。
- 使用连接:应用程序使用获取到的连接执行数据库操作。
- 归还连接:应用程序使用完连接后,将连接归还给连接池的空闲连接队列,以便其他请求复用。
高并发场景下可能遇到的问题及解决方案
- 连接池耗尽:
- 问题:高并发时,请求的连接数超过连接池最大连接数,导致部分请求获取不到连接。
- 解决方案:
- 适当增加连接池的最大连接数,但要考虑数据库服务器的承载能力,避免过多连接导致数据库性能下降。
- 优化业务逻辑,减少不必要的数据库连接请求,例如合并多个短时间内的请求。
- 连接泄露:
- 问题:应用程序获取连接后未正确归还连接到连接池,导致连接池中的可用连接逐渐减少。
- 解决方案:
- 确保在代码中正确关闭连接,使用
try - finally
语句块保证连接在使用完毕后归还。 - 可以设置连接的超时时间,连接池定期清理长时间未使用的连接。
- 确保在代码中正确关闭连接,使用
- 连接失效:
- 问题:数据库服务器重启或网络波动等原因,导致连接池中的连接失效,应用程序使用这些失效连接时会报错。
- 解决方案:
- 使用连接池的
ping
方法,在获取连接时检查连接是否有效,如果无效则重新获取连接。 - 定期对连接池中的连接进行健康检查,移除无效连接并重新创建。
- 使用连接池的