fastapi后台任务中使用多线程调用数据库session报错

7 篇文章 0 订阅
5 篇文章 0 订阅

起因

批量耗时任务创建的api,最开始采用for循环串行执行耗时任务,使用的是请求初始化时的数据库session,技术上没问题。

报错

但业务上需要优化成并发。

上来直接改造多线程,发现子线程很快stoped,根本没执行

坑1 子线程的异常不会被主进程捕获

望着代码陷入自我怀疑,再三确认了多线程的代码没问题,想起来如题的坑,于是在子线程的函数中加入try catch,通过logging主动捕获并打印出异常。

坑2 多线程使用同一个会话报错

异常打出来了:

Instance '<Target at 0x7efe1a66bb80>' is not persistent within this Session

于是修改子线程函数,增加参数,接受一个新创建的会话。继续报错如下:

坑3 旧会话需要关闭,新会话要添加数据实体

Object '<Target at 0x7ff45077d3f0>' is already attached to session '1' (this is '2')
from sqlalchemy.orm import sessionmaker
from your_model import YourModel, engine

## 关闭旧会话
session_old.close()


# 将实体添加到另一个会话中

# 创建会话
Session = sessionmaker(bind=engine)
session = Session()

# 创建一个新实体或获取现有实体
entity = YourModel(...)

# 将实体添加到会话
session.add(entity)

# 进行操作
# ...

# 提交会话
session.commit()

# 关闭会话
session.close()

终于,世界恢复平静!

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在Java,可以使用多线程调用数据库并返回结果。首先,需要创建一个数据库连接池来管理数据库连接,以确保线程之间可以共享连接资源并避免频繁地创建和关闭连接。 可以使用Java的多线程库来创建和管理线程。通过继承Thread类或实现Runnable接口,可以创建多个线程对象来同时执行数据库操作。 在每个线程,可以使用JDBC(Java Database Connectivity)来连接数据库并执行SQL查询。可以使用JDBC提供的接口和方法来执行数据库操作,例如创建连接、创建和执行SQL语句、处理查询结果等。 每个线程在执行完数据库操作后,可以将结果存储在一个共享的数据结构,例如List或Map。可以使用synchronized关键字来确保多个线程之间的数据同步和互斥访问。 当所有线程完成数据库操作后,可以通过合并和分析每个线程的结果来得到最终的结果。可以使用join()方法等待所有线程执行完毕,并对每个线程的结果进行处理和合并。 需要注意的是,在多线程调用数据库时,需要注意数据库连接的线程安全性和资源的释放。确保在操作完数据库后及时释放连接以避免连接异常或资源泄漏。 总结来说,通过合理地创建和管理线程、使用JDBC连接数据库并执行查询、同步和合并线程的结果,可以实现多线程调用数据库并返回结果的功能。这种方式可以提高数据库操作的效率和并发性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值