sqlalchemy默认数据库连接池限制导致的服务异常排查

6 篇文章 0 订阅
5 篇文章 0 订阅

现象和log

批量添加100个耗时任务,发现有成功执行仅有15个,找到报错log

  return db.query(models.Config).first()
  File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/orm/query.py", line 2748, in first
    return self.limit(1)._iter().first()  # type: ignore
  File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/orm/query.py", line 2847, in _iter
    result: Union[ScalarResult[_T], Result[_T]] = self.session.execute(
  File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/orm/session.py", line 2308, in execute
    return self._execute_internal(
  File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/orm/session.py", line 2180, in _execute_internal
    conn = self._connection_for_bind(bind)
  File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/orm/session.py", line 2047, in _connection_for_bind
    return trans._connection_for_bind(engine, execution_options)
  File "<string>", line 2, in _connection_for_bind
  File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/orm/state_changes.py", line 139, in _go
    ret_value = fn(self, *arg, **kw)
  File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/orm/session.py", line 1143, in _connection_for_bind
    conn = bind.connect()
  File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/engine/base.py", line 3268, in connect
    return self._connection_cls(self)
  File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/engine/base.py", line 145, in __init__
    self._dbapi_connection = engine.raw_connection()
  File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/engine/base.py", line 3292, in raw_connection
    return self.pool.connect()
  File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/pool/base.py", line 452, in connect
    return _ConnectionFairy._checkout(self)
  File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/pool/base.py", line 1269, in _checkout
    fairy = _ConnectionRecord.checkout(pool)
  File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/pool/base.py", line 716, in checkout
    rec = pool._do_get()
  File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/pool/impl.py", line 158, in _do_get
    raise exc.TimeoutError(
sqlalchemy.exc.TimeoutError: QueuePool limit of size 5 overflow 10 reached, connection timed out, timeout 30.00 (Background on this error at: https://sqlalche.me/e/20/3o7r)
WARNING: 2024-03-01 Friday 06:21:39 utils.py --------runing-----[<function start at 0x7f3aebce5f30>, (<models.scan.Target object at 0x7f3aeb24bb20>,), {}]
ERROR: 2024-03-01 06:21:39,827 utils.py eeeeeeeeee-----QueuePool limit of size 5 overflow 10 reached, connection timed out, timeout 30.00 (Background on this error at: https://sqlalche.me/e/20/3o7r)

原因

sqlalchemy的连接池默认设置pool_size=5, max_overflow=10。

方案

考虑内存和cpu,合理设置以上2个参数。

  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
个步骤: 1. 找到链表尾部节点的前一个节点。 ```c struct Node* prevNode = *head; while (prevNode->next->next != NULL) { prevNode = prevNode->next; } ``` 2. 找到SQLAlchemy是一个流行的Python ORM框架,它提供了一个灵活的数据库连接池连接池是一种链表尾部节点。 ```c struct Node* delNode = prevNode->next; ``` 3. 将前一个节点的技术,它可以提高数据库操作的性能和可靠性。它通过维护一定数量的数据库连接来避免频繁地打开和关闭数据库连接,从而提高效率。 下面是SQLAlchemy连接池的一些原指针域设置为`NULL`。 ```c prevNode->next = NULL; ``` 4. 释放被删除节点理说明: 1. SQLAlchemy连接池是基于Python标准库中的Queue模块实现的。连接池是一个队的内存空间。 ```c free(delNode); ``` 完整代码如下: ```c void deleteAtTail(struct列,其中每个元素都是一个数据库连接对象。 2. 当客户端请求一个数据库连接时,连接池会 Node** head) { if (*head == NULL) { return; } if ((*head)->next == NULL) { 从队列中获取一个空闲连接对象。如果队列为空,连接池会创建一个新的连接对象,并将其加 free(*head); *head = NULL; return; } struct Node* prevNode = *head; while (prev入队列。 3. 客户端使用完连接对象后,必须将其还回连接池中。连接池会将Node->next->next != NULL) { prevNode = prevNode->next; } struct Node* delNode = prevNode连接对象标记为可用,然后将其放回队列中。 4. 如果连接池中的连接对象数量超->next; prevNode->next = NULL; free(delNode); } ``` ## 5. 动态链表的修改过了设定的上限,连接池会将多余的连接对象关闭,以避免资源浪费。 5. SQLAlchemy连接池还提供了一些高级功能,比如连接池中连接对象的自动重连、超时控制 动态链表的修改操作需要完成以下几个步骤: 1. 找到待修改节点。 ```c struct Node、连接对象状态检查等。 总之,SQLAlchemy连接池是一种非常有用的技术,可以提高* currNode = *head; while (currNode != NULL && currNode->data != oldData) { currNode = currNode数据库操作的性能和可靠性。它可以避免频繁地打开和关闭数据库连接,从而节省资源和时间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值