title: FastAPI数据库连接池配置与监控

date: 2025/04/28 00:13:02

updated: 2025/04/28 00:13:02

author: cmdragon

excerpt:

FastAPI数据库连接池通过预先创建和复用连接,显著降低连接创建开销。配置参数包括最小连接数(minsize)、最大连接数(maxsize)和空闲连接存活时间(max_inactive_connection_lifetime)。通过Tortoise-ORM集成Prometheus和Grafana实现实时监控,优化连接管理。常见问题如连接池耗尽和连接泄漏,可通过增加maxsize、检查未提交事务和使用async with管理事务来解决。定期监控和优化连接池参数是确保数据库性能的关键。

categories:

  • 后端开发
  • FastAPI

tags:

  • FastAPI
  • 数据库连接池
  • Tortoise-ORM
  • 性能监控
  • Prometheus
  • Grafana
  • 连接池优化


扫描二维码关注或者微信搜一搜:编程智域 前端至全栈交流与成长

探索数千个预构建的 AI 应用,开启你的下一个伟大创意https://tools.cmdragon.cn/

FastAPI数据库连接池配置与监控实战

1. 数据库连接池基础原理

数据库连接池如同出租车调度站,预先创建多个可用连接供应用程序随时调用。当客户端请求到达时,连接池会分配空闲连接;请求结束后,连接会返回池中等待下次使用。这种机制相比传统即用即建的方式,能有效降低连接创建开销。

# 配置Tortoise-ORM连接池示例
TORTOISE_ORM = {
"connections": {
"default": {
"engine": "tortoise.backends.asyncpg",
"credentials": {
"host": "localhost",
"port": "5432",
"user": "postgres",
"password": "secret",
"database": "mydb",
"minsize": 3, # 最小保持连接数
"maxsize": 20, # 最大连接数
"max_inactive_connection_lifetime": 300 # 空闲连接存活时间(秒)
}
}
},
"apps": {
"models": {
"models": ["models"],
"default_connection": "default"
}
}
}

2. 连接池参数详解

  • minsize:相当于出租车公司的最低保障车队,即使深夜时段也保持3辆待命
  • maxsize:节假日最大调度能力,最多可派出20辆出租车
  • max_inactive_connection_lifetime:车辆闲置5分钟后自动回收,节省停车费用

实时监控示例代码:

from tortoise import Tortoise

@app.get("/pool-status")
async def get_pool_status():
pool = Tortoise.get_connection("default")._pool
return {
"current_size": pool._size,
"idle": len(pool._holders),
"in_use": pool._size - len(pool._holders)
}

3. 生产环境监控方案

采用Prometheus + Grafana构建可视化监控平台:

  1. 安装监控组件:
pip install prometheus-client prometheus-fastapi-instrumentator
  1. 集成指标收集:
from prometheus_client import make_asgi_app
from prometheus_fastapi_instrumentator import Instrumentator # 添加Prometheus中间件
metrics_app = make_asgi_app()
app.mount("/metrics", metrics_app) # 自定义连接池指标
class DatabaseMetrics:
def __init__(self):
self.connections_in_use = Gauge(
'db_connections_in_use',
'Current active connections'
) async def update_metrics(self):
pool = Tortoise.get_connection("default")._pool
self.connections_in_use.set(pool._size - len(pool._holders)) # 启动定时任务
@app.on_event("startup")
async def start_metrics_task():
metrics = DatabaseMetrics() async def _task():
while True:
await metrics.update_metrics()
await asyncio.sleep(5) asyncio.create_task(_task())

4. 连接池性能优化实战

用户注册场景下的连接管理:

from fastapi import APIRouter
from models import User_Pydantic, UserIn_Pydantic, Users router = APIRouter() @router.post("/users", response_model=User_Pydantic)
async def create_user(user: UserIn_Pydantic):
try:
# 自动获取连接执行操作
user_obj = await Users.create(**user.dict())
return await User_Pydantic.from_tortoise_orm(user_obj)
except Exception as e:
# 记录异常但不干扰连接池
logger.error(f"Create user failed: {str(e)}")
raise HTTPException(status_code=400, detail="User creation failed")

课后Quiz

问题1:当数据库响应变慢时,如何快速判断是否连接池不足?

A) 检查CPU使用率

B) 监控连接等待队列

C) 查看磁盘空间

D) 重启数据库服务

答案:B) 监控连接等待队列。当所有连接都被占用时,新请求会进入等待队列,此时需要适当增大maxsize或优化查询性能。

问题2:以下哪种情况可能导致连接泄漏?

A) 未关闭游标对象

B) 忘记提交事务

C) 未设置max_inactive_connection_lifetime

D) 所有选项都可能

答案:D) 所有选项都可能。未释放的资源都会导致连接无法回到池中,最终耗尽连接池。

常见报错处理

错误现象

TimeoutError: Connection pool exhausted

解决方案

  1. 检查当前连接使用情况:
# 临时获取连接池状态
from tortoise import Tortoise async def check_pool():
conn = Tortoise.get_connection("default")
print(f"Max size: {conn._pool._maxsize}")
print(f"Current size: {conn._pool._size}")
print(f"Available: {len(conn._pool._holders)}")
  1. 优化建议:
  • 适当增加maxsize参数
  • 检查是否存在长时间未提交的事务
  • 添加连接等待超时配置:
credentials = {
...
"timeout": 30 # 等待连接超时时间(秒)
}

预防措施

  • 使用async with管理事务:
async with in transaction():
# 数据库操作
await User.create(...)
  • 定期执行SELECT 1保持空闲连接
  • 设置合理的max_inactive_connection_lifetime(建议300-600秒)

余下文章内容请点击跳转至 个人博客页面 或者 扫码关注或者微信搜一搜:编程智域 前端至全栈交流与成长,阅读完整的文章:FastAPI数据库连接池配置与监控 | cmdragon's Blog

往期文章归档:

FastAPI数据库连接池配置与监控的更多相关文章

  1. Tomcat6.0数据库连接池配置

    http://blog.163.com/magicc_love/blog/static/185853662201111101130969/ oracle驱动包Tomcat 6.0配置oracle数据库 ...

  2. 【Java】java数据库连接池配置的几种方法

    今天遇到了关于数据源连接池配置的问题,发现有很多种方式可以配置,现总结如下,希望对大家有所帮助:(已Mysql数据库为例) 一,Tomcat配置数据源: 方式一:在WebRoot下面建文件夹META- ...

  3. Tomcat数据库连接池配置

    Tomcat数据库连接池配置 1.            Server.xml的配置 (1)找到tomcat所在目录下的conf\server.xml文件 (2)在文件最后一个</host> ...

  4. 数据库连接池配置(案例及排查指南) 原创: 有赞技术 有赞coder 4天前

    数据库连接池配置(案例及排查指南) 原创: 有赞技术 有赞coder 4天前

  5. Druid数据库连接池配置

    DRUID是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0.DBCP.PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针对监控而生的DB ...

  6. springboot整合druid数据库连接池并开启监控

    简介 Druid是一个关系型数据库连接池,它是阿里巴巴的一个开源项目.Druid支持所有JDBC兼容的数据库,包括Oracle.MySQL.Derby.PostgreSQL.SQL Server.H2 ...

  7. Mybatis技术一数据库连接池配置(druid)

    只简单叙述,网上相关的内容很多,这里只是给出参考: 数据库连接池druid配置列表: 配置 缺省值 说明 name   配置这个属性的意义在于,如果存在多个数据源,监控的时候可以通过名字来区分开来.如 ...

  8. 阿里druid数据库连接池配置

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  9. j2ee数据库连接池配置大全

    <!--web.xml begin--> <!--web.xml Spring ApplicationContext配置文件的路径 ,可使用通配符,多个路径用,号分隔 --> ...

  10. spring boot +druid数据库连接池配置

    1.启动应用入口修改 增加servlet注解 import javax.sql.DataSource; import org.apache.ibatis.session.SqlSessionFacto ...

随机推荐

  1. LeetCode 第3题:无重复字符的最长子串

    LeetCode 第3题:无重复字符的最长子串 题目描述 给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度. 难度 中等 题目链接 https://leetcode.cn/proble ...

  2. 同步工具-SeaTunnel使用

    一.介绍 SeaTunnel 是一个非常好用.超高性能的分布式数据集成平台,架构于 Apache Spark 和 Apache Flink 之上,实现了海量数据的实时同步与转换.每天可以稳定高效地同步 ...

  3. Hetao P1307 树的剖分 题解 [ 蓝 ] [ 树形 dp ] [ 贪心 ]

    树的剖分:很厉害的性质题,代码也很好写.运用到了奇偶性拼凑答案的 trick. 观察 首先发现一个很重要的条件:一个点的点权只可能是 \(0,1,2\). 这个条件开始我们可能无法用上,于是先想最后的 ...

  4. Luogu P9870 NOIp2023 双序列拓展 题解 [ 紫 ] [ 动态规划 ] [ 分治 ] [ adhoc ]

    双序列拓展:很妙的特殊性质类 dp 题,由部分分引导向正解. 题意简化 你可以把序列 \(X\) 和序列 \(Y\) 中的每一个数复制若干倍并接到这个数后面,问能否构造出一种方案,使得两个序列长度相等 ...

  5. mybatis之xml简单映射,解决实体类属性字段与数据库表字段不一致问题

    当实体类属性字段与数据库表字段不一致时该怎么办? 方法一:起别名 <select id="getUserList" resultType="RealUser&quo ...

  6. 支付宝 v3 自签名如何实现

    今天在看文档的时候,发现支付宝新出了一个 v3 版本的接口调用方式,感觉有点意思,花了点时间研究了下这个版本要怎么实现自签名,大家有兴趣可以看看. 什么是支付宝 API v3 版本? 官网上给的解释是 ...

  7. DeepSeek智能编程

    技术背景 DeepSeek开源之后,让大家意识到了即时是在自己硬件性能一般的本地环境,也能够部署和使用大语言模型,真正实现了大模型的"私有化".而私有化大模型之后,自然是考虑生产力 ...

  8. php查询结果汉字乱码解决方法

    问题描述:使用php查询数据显示,显示的结果中所有汉字乱码 问题及解决:这种情况是编码造成的,检查数据库及页面编码是否一致,也可在页面增加: header('Content-Type:text/htm ...

  9. Selenium 项目搭建过程

    Selenium 环境搭建多多少少大概有4.5次了,每次都有东西遗忘,整理下大概的过程: 安装python,下载exe文件 C:\Users\lic\AppData\Local\Programs\Py ...

  10. 在 Hugging Face 上部署语音转语音模型

    介绍 S2S (语音到语音) 是 Hugging Face 社区内存在的一个令人兴奋的新项目,它结合了多种先进的模型,创造出几乎天衣无缝的体验: 你输入语音,系统会用合成的声音进行回复. 该项目利用 ...