java - 如何解决由于循环内繁重的数据库调用而导致的事务超时 - EJB
问题描述
如主题中所述,总超时时间为 120 秒,在处理事务时超过了。实现类似于下面的伪代码。
最初的想法是使用 TransactionAttributeType.NOT_SUPPORTED 将 methodA 从 tx 上下文中取出,并将代价高昂的 db 方法调用移至 REQUIRES_NEW(新事务)。但是考虑到方法 A 的实现,它非常忙碌。而且 db proc 已经优化到了最佳性能。
有什么解决方法吗:) 真的很感激
public String methodA(x){
String resp;
------ other implementations
if(x==10){
for(int k; k < 10 ; k++){
dbcall() --- method with heavy db proc which costs around 15seconds
}
}
------ other implementations
return resp;
}
更新:更改超时持续时间不是一种选择
解决方案
对于 Bean Managed Transactions,可以使用 UserTransaction 接口的 setTransactionTimeout 方法设置超时时间,对于 Container Managed Transactions,应该使用服务器特定的配置(即对于 JBOSS,可以使用注解 org.jboss.ejb3.annotation.TransactionTimeout )。
例子:
@TransactionTimeout(unit=TimeUnit.MINUTES, value=10)
public void doAction() {
doAction 方法事务的有效期最长为 10 分钟,对于 bean 管理的事务也可以使用以下处理:
public void doAction() {
try {
ut.setTransactionTimeout(60 * 10);
ut.begin();
请注意,该方法将参数设为秒(即 10 分钟 = 10 * 60)。
推荐阅读
- reactjs - 在 sagas 中的地图内获取数据
- database - 如何在多对多关系中创建部分依赖关系?
- python - 如何将图像重塑为 NxNx3 块并分别在其通道上执行操作
- python - Selenium 在使用 Python 时无法单击“获取数据”按钮
- node.js - Symfony 5.2 + Webpack Encore:npm 运行显示错误“意外令牌”
- maven - 通过 maven-invoker-plugin 运行构建后脚本
- repeat - 如何复制粘贴很多很快(img01,img02,img03,...)不同的html?
- maven - 有没有办法根据构建期间创建的文件激活配置文件?
- node.js - 在 nest.js 中设置请求标头大小限制
- javascript - 当在单个输入上调用 onChange 时,React 输入元素都会重新渲染,即使输入上有 memo 并且 onChange 上有 useCallback