fastapi + aiomysql使用连接池配置maxsize次数据库连接之后, 访问不报错一直卡

字号+ 编辑: 国内TP粉 修订: 种花家 来源: 2024-04-08 我要说两句(0)

笔者是使用chatGPT获取到的demo代码, 遇到了如题的问题。

先看看项目根目录下database.py出现问题的逻辑:

import aiomysql
pool = None
async def _init_db_pool():
    global pool
    if pool is None:
        pool = await aiomysql.create_pool(
            host='127.0.0.1',
            port=3306,
            user='root',
            password='helloworld',
            db='mydatabase',
            charset='utf8mb4',
            autocommit=True,
            minsize=1,
            maxsize=10,
            pool_recycle=3600,
        )

async def get_connection():
    return await pool.acquire()

这里我们把连接池的maxsize设定为10, 意味着什么? 这个项目能同时有10个数据库连接句柄,不能搞再多。

再看一下逻辑代码:

async def list_some(limit: int):
    async with await get_connection() as conn:
        async with conn.cursor(aiomysql.DictCursor) as cur:
            await cur.execute(f"SELECT * FROM archive "
                              f"WHERE deleted = 2 "
                              f"order by addtime desc "
                              f"LIMIT {limit}")

            r = await cur.fetchall()
            return r

跑到浏览器上测试类似的业务, 访问10下是没问题的, 第11下就挂掉。看控制台,也没有任何报错,想重启项目,没有响应,只能按强制重启。

这个时候10个连接句柄实际一直在await状态, 为什么会这样呢?

我们查看这两个语句

# get_connection方法中的返回语句
return await pool.acquire()
# 逻辑取数据库连接时候
async with await get_connection() as conn:

这两段逻辑中, 实际是出现了两个await, 这样导致获取数据库连接这一步发生了莫名其妙的等待。处理访问逻辑就会挂死。

如果尝试删除第二句的await, IDE报错, 只能删除get_connection()方法下的await

阅完此文,您的感想如何?
  • 有用

    3

  • 没用

    0

  • 开心

    0

  • 愤怒

    0

  • 可怜

    0

1.如文章侵犯了您的版权,请发邮件通知本站,该文章将在24小时内删除;
2.本站标注原创的文章,转发时烦请注明来源;
3.Q群: 2702237 13835667

相关课文
  • mac开发接入微信公众号接口返回报错 cURL error 56: SSLRead() return error -9806

  • PHP的换行符是什么

  • pecl安装程序时报错Array and string offset access syntax with curly braces is no longer supported

  • 由于商家传入的H5交易参数有误,该笔交易暂时无法完成,请联系商家解决

我要说说
网上嘉宾点评