【问题标题】:Query timeout not working for MS SQL server in spring boot查询超时不适用于春季启动中的 MS SQL 服务器
【发布时间】:2021-08-09 22:35:47
【问题描述】:

我正在尝试在我的 Spring Boot Rest API 中设置查询超时。我正在执行一个存储过程(只读)。但是超时不起作用。

我使用 MS SQL 服务器作为数据源。

spring.datasource.url=jdbc:sqlserver://<servername>;instanceName=<instancename>;DatabaseName=<dbname>

春季开机版

2.4.4

尝试了以下选项 -

  1. 使用超时设置@Transactional 注释
@Repository
public class StoredProcImpl  {

    @PersistenceContext
    private EntityManager entityManager;

    @Transactional (timeout = 30)
    public String getList() throws Exception {

        StoredProcedureQuery query = this.entityManager.createNamedStoredProcedureQuery("proc");
        query.setParameter("PAGE_NUMBER", offset);
        query.execute();

}
  1. 在查询中设置提示
@Repository
public class StoredProcImpl  {

    @PersistenceContext
    private EntityManager entityManager;

    public String getList() throws Exception {

        StoredProcedureQuery query = this.entityManager.createNamedStoredProcedureQuery("proc");
        query.setHint("javax.persistence.query.timeout", 30);
        query.setParameter("PAGE_NUMBER", offset);
        query.execute();

}

还有

query.setHint("org.hibernate.timeout", 30)

所有选项都不起作用,即使 30 秒后查询也会继续等待。

感谢任何设置超时的帮助或指针。

【问题讨论】:

    标签: spring spring-boot


    【解决方案1】:

    您可以使用 JPA 的 javax.persistence.query.timeout 属性配置超时。该值是以毫秒为单位的超时时间。它是 JPA 规范的可选部分,但 Hibernate 支持它。您可以通过将以下内容添加到 application.properties 在 Spring Boot 中对其进行配置:

     spring.jpa.properties.javax.persistence.query.timeout=60000
    

    为了使超时通用化,在您的 JpaConfiguration 中,当您声明 PlatformTransactionManager Bean 时,您可以设置事务的默认超时:

    @Bean
    public PlatformTransactionManager transactionManager() throws Exception {
        JpaTransactionManager txManager = new JpaTransactionManager();
        txManager.setEntityManagerFactory(entityManagerFactory().getObject());
        txManager.setDataSource(this.dataSource);
        txManager.setDefaultTimeout(10); //Put 10 seconds timeout
        return txManager;
    }
    

    PlatformTransactionManager 继承了包含该方法的 AbstractPlatformTransactionManager:

      public final void setDefaultTimeout(int defaultTimeout) {
            if (defaultTimeout < TransactionDefinition.TIMEOUT_DEFAULT) {
                throw new InvalidTimeoutException("Invalid default timeout", defaultTimeout);
            }
            this.defaultTimeout = defaultTimeout;
        }
    

    【讨论】:

    • @Sridhar V 我正在编辑我的答案,请检查
    • 感谢您的意见。我的事务管理器代码中没有任何 JpaConfiguration。您能否详细说明在哪里设置或使用它。我有一个 NamedStoredProcedureQuery,它描述了要调用的存储过程以及 in 和 out 参数。如我的问题描述所示,它正在 getList() 方法中执行。
    • 可以自己输入配置类,也可以添加到主类中
    • 我应该如何在查询中使用 txManager ?
    • 在你的情况下,你必须编写配置类
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多