sqlalchemy数据库连接池QueuePool异常

数据库相关错误的解决办法

错误一:数据库连接池超过限制

  • SqlAlchemy QueuePool limit overflow
    在这里插入图片描述
    造成连接数超过数据库连接池的限制,有两方面的原因,第一个是由于数据库连接池数比较小,因此当连接数稍微增加的时候就会超过限制,另一个原因就是在使用完数据库连接后未能即使释放,最后造成数据连接数持续增加从而超出数据库连接池的限制,所以我们也可以从这两个方面来解决这个问题,但是根本上还是得解决后一个原因造成的问题,不然即便是将数据库连接池增大时间长之后也还是会出现相同的问题。
解决办法
  • 方法一
    python和java都有finally关键字,在执行完所有代码之后再执行finally处的代码,有这个关键字相助就让我们能够很好的解决这个问题,只要在进行完所有的数据库操作之后将数据库连接关闭即可。
connection = DBSession.connection()
try:
    rescount = connection.execute("select resource_id,count(resource_id) as total FROM resourcestats")
    #do something
finally:
    connection.close()
  • 方法二
    学过python的小可爱们都知道python有个很好用的东西叫做装饰器,因为方式的解决办法在针对一个函数操作数据库的时候还是比较好用的,但是在一个项目中绝对是不止一个操作数据的函数的,如果在每个操作数据库函数的后方都加上finally关键值的话,会显得很累赘不说,如果有些函数忘记加了也会很麻烦,这个时候装饰器就显得很有用了,只要在函数上加上一个关闭数据库连接的装饰器,就能够在所有数据库操作结束之后关闭数据库连接

如果有不了解python的装饰器的可以看一下这个文章:理解 Python 装饰器看这一篇就够了

def shutdown_session(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        result, msg = func(*args, **kwargs)
        db.session.close()
        db.session.rollback()
        return result, msg
    return wrapper

在数据库操作函数前加上上面的装饰器即可解决对应的问题

错误二:数据库事务未回滚

在这里插入图片描述
查询报错:sqlalchemy.exc.InvalidRequestError: Can’t reconnect until invalid transaction is rolled back
原因是:连接断开后,事务没有回滚,残留的锁导致后续的查询报错.sqlalchemy对每一个查询和插入等操作都是一个事务。

# main.py
from models import OrderInfo 
from sqlalchemy.exc import InvalidRequestError
try:
    order = OrderInfo.query.filter_by(task_id=user_dict.get('task_id')).first()
    order.status = 'COMPLETE'
    db.session.commit()
except InvalidRequestError:
    db.session.rollback()
except Exception as e:
    print(e)

解决:在所有的数据库操作的时候捕捉异常进行事务的回滚。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值