当前位置: 首页 > 知识库问答 >
问题:

Spring@Transactional timeout在DB2中无法正常工作

路金鑫
2023-03-14

我们有一个与DB2(LUW)数据库集成的spring应用程序。

在特定的流中,我们有一个用@Transactional(timeout=60)

在数据库重载情况下,我们观察到上述60秒的超时无法及时引发异常。只有当数据库处理成功或出现错误时,它才会这样做。

失败的消息如下所示:

2020-02-21 18:45:32463错误。。。交易超时:截止日期为2020年2月21日星期五18:40:14 EET

请注意,异常是在数据库释放资源后引发的,在特定情况下会出现锁定超时错误,由于配置的事务超时,比我预期的晚了大约5分钟。

我试图通过手动在数据库中造成延迟来重现这种行为。具体地说,我从我的应用程序中调用sleep DB2过程,时间比配置的事务超时时间长。我的测试有相同的结果,只有在睡眠操作成功结束后才会抛出异常。

我想用另一个数据库检查类似的场景,所以我创建了一个简单的Spring Boot项目,其中有两个不同的配置文件,一个用于DB2,一个用于Postgres。运行这个示例时,我观察到DB2的类似行为,即事务超时不会导致任何错误,或者它只在为DB2配置的睡眠时间(30秒)结束后才会导致错误,该睡眠时间大于配置的事务超时(10秒)。

相反,研究生的行为或多或少是我所期望的。与数据库的连接结束时出现一个异常,即事务超时时间已过的确切时刻(10秒),而无需等待睡眠操作完成(30秒)。

下面是示例项目。以下是本文描述的示例:

package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class DemoService {

    @Autowired
    private DemoRepository repository;

    @Transactional(timeout = 10)
    public void sleep() {
        repository.sleep();
    }
}
package com.example.demo;

public interface DemoRepository {
    void sleep();
}

package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Profile;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

@Repository
@Profile("db2")
public class Db2DemoRepository implements DemoRepository {

    @Autowired
    private JdbcTemplate template;

    @Override
    public void sleep() {
        template.execute("call SYSIBMADM.DBMS_ALERT.SLEEP(30)");
    }
}
package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Profile;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

@Repository
@Profile("postgres")
public class PostgresDemoRepository implements DemoRepository {

    @Autowired
    private JdbcTemplate template;

    @Override
    public void sleep() {
        template.execute("html" target="_blank">select pg_sleep(30);");
    }
}

我猜transaction timeout在Postgres中设置了查询超时,但在DB2中没有设置。我还尝试了以下DB2配置属性的几个值,但没有成功:timerLevelForQueryTimeOut、interruptProcessingMode、queryTimeout

所以我的问题是:

  1. 我试图重现问题并测试几个DBs的方式有意义吗?还是我遗漏了什么
  2. 更重要的是,有没有办法在事务超时达到极限时让DB2连接失败

共有1个答案

宣望
2023-03-14

由于我发布问题已经有一段时间了,但没有人发布答案,我将把我的发现从问题的编辑部分转移到这里:

解决方案似乎是设置DB2配置属性queryTimeoutterruptProcessingMode=2(而不是我最初认为的中断处理模式)

示例:jdbc: db2://localhost:50000/demo: queryTimeoutInterrupProcessingMode=2;

通过此修改,事务超时结束时会引发异常。不过我想听听专家们的意见。例如,修改特定属性是否安全?影响是什么?

 类似资料:
  • 问题内容: 我有一个课程,如何让@JsonIgnore工作。即使将注释放在此处,它也不会影响输出。我正在使用杰克逊。 这是我的Controller方法: 这是我的servlet-context.xml: 问题答案: 我终于找到了解决方案。我将导入声明从 至 基本上,您必须确保在所有地方都使用相同的类。

  • } 这是我的配置。但似乎/用户/无法被任何人访问。 每当我输入“. hasRole(“RoleName”)”时,它只会拒绝该角色的访问。我得到一个{“时间戳”:1526671066818,“状态”: 403,“错误”:“禁止”,“消息”:“拒绝访问”,“路径”:“/用户”} 从那。 我想要的是,一些请求只允许“USER”访问,例如:“/entrysheet”,“/datasheet”等,而“ADM

  • 问题内容: 我正在尝试使用带注释的TX Spring支持。 应用程序上下文XML: 实际代码: 调用代码: 它给出了 FALSE。 我究竟做错了什么? 问题答案: 您应该在配置中添加它 在您的RepositoryClass上添加一个接口 这在你的测试课中 请参阅本教程。

  • 问题内容: 尽管我很确定这是昨天或前一天工作的,例如,在IE10中不再起作用。我已经测试了我的浏览器,但是它不再起作用了。还有谁有相同的问题吗?或者,它永远都行不通吗? 问题答案: IE不支持输入type =“ number”,但您可以使用jQueryUISpinner小部件。它非常易于使用,并且具有许多对开发人员友好的API。

  • 问题内容: 工作如何? 以下代码在这里不起作用: Employee.java 地址.java persistence.xml 这是测试类……请检查城市名称,它没有在ADDRESS表中按降序存储地址值 JPAOrderByAnnotationTest 问题答案: 我认为您误解了注释的实际作用。根据javadoc: 指定在 检索 关联或集合时,将值指定为关联的集合或元素集合的元素的顺序。 [添加重点]

  • 我这里有点麻烦。我试图在我的MVC4项目中使用TinyMCE作为文本编辑器。 到目前为止,这很简单,我只需要能够正确地显示编辑器。 我有两个重要的类。 控制员: 然后是视图,这就是我试图让TinyMCE工作的地方: @{ViewBag.Title=“Index”;} 亲善 这是一些可以用TinyMCE编辑的内容。 出于某种原因,结果是这样的:它看起来如何 知道为什么我没有从TinyMCE获得任何功