【问题标题】:How to configure custom database connection timeout in Spring Boot application?如何在 Spring Boot 应用程序中配置自定义数据库连接超时?
【发布时间】:2019-08-25 22:27:03
【问题描述】:

在我的 Spring boot(2.0.7 RELEASE) 应用程序中,我无法在 application.properites 文件中手动设置/覆盖数据库连接的超时。我正在使用 JPA、Hibernate、Tomcat 连接池和 Postgres。

我已经彻底研究并发现了非常相似的问题:

我提出新问题的原因是因为上述问题都没有公认的答案,也没有确认的工作解决方案。我尝试在我的 application.properties 文件中包含每个建议的解决方案,但没有成功。

另外,如问题 2 中所述:如果我在 @Transactional 注释中添加参数 'timeout = someSeconds',连接会按预期超时,但如果我尝试在 application.properties 中提取它,它会失败并在默认时间超时.这里的问题是,我希望所有连接在给定时间内都超时,而不仅仅是事务。

我在 application.properties 中尝试过的事情(所需的超时时间为 4 秒):

  • spring.jpa.properties.javax.persistence.query.timeout=4000
  • spring.jdbc.template.query-timeout=4
  • spring.transaction.defaultTimeout=4
  • spring.datasource.tomcat.validation-query-timeout=4

我读过的资料:

我错过了一些财产吗?有谁知道为什么不能通过 application.properties 文件覆盖超时?

提前致谢。

【问题讨论】:

  • 根据 Spring 2.0.7 属性(docs.spring.io/spring-boot/docs/2.0.7.RELEASE/reference/…),属性键是 spring.transaction.default-timeout 而不是 spring.transaction.defaultTimeout。试试吧,让我们知道。
  • 感谢您的建议。不幸的是,结果是一样的——连接没有在指定的时间内超时。此外,我正在尝试找到一个包含所有连接而不仅仅是事务的解决方案。
  • 您找到解决方案了吗?在这里面临同样的问题......
  • 很遗憾没有。我没有发现任何新东西。

标签: java spring spring-boot jdbc


【解决方案1】:

至少要配置 3 个超时:

  1. 事务超时,您已经这样做了。我在 transactionManager bean 中声明了我的:
txManager.setDefaultTimeout(myDefaultValue);
  1. 查询超时(显然不需要@transactional),你已经做过并且还解释了here

  2. 网络超时(阅读此excellent article)。

就我而言,我使用的是Oracle,我的bean配置如下:

    @Bean
    public HikariDataSource dataSource() {
        
        HikariDataSource ds = new HikariDataSource();
        ds.setDriverClassName(springDatasourceDriverClassName);
        ds.setJdbcUrl(springDatasourceUrl);
        ds.setUsername(springDatasourceUsername);
        ds.setPassword(springDatasourcePassword);
        ds.setDataSourceProperties(oracleProperties());
        
        return ds;
    }
    
    Properties oracleProperties() {
        Properties properties = new Properties();
        
        properties.put("oracle.net.CONNECT_TIMEOUT", 10000);
        properties.put("oracle.net.READ_TIMEOUT", 10000);
        properties.put("oracle.jdbc.ReadTimeout", 10000);

        return properties;
    }

如果您不想为 DataSource 配置 bean(这是大多数人会做的),您可以在 application.properties 中配置网络超时属性:

spring.datasource.hikari.data-source-properties.oracle.net.CONNECT_TIMEOUT=10000
spring.datasource.hikari.data-source-properties.oracle.net.READ_TIMEOUT=10000
spring.datasource.hikari.data-source-properties.oracle.jdbc.ReadTimeout=10000

【讨论】:

    【解决方案2】:

    取决于你的数据源,但你可以试试这个:

    spring.datasource.hikari.max-lifetime=1000
    spring.datasource.hikari.connection-timeout=1000
    spring.datasource.hikari.validation-timeout=1000
    spring.datasource.hikari.maximum-pool-size=10
    

    【讨论】:

      猜你喜欢
      • 2018-02-22
      • 2017-11-22
      • 2018-09-11
      • 2021-10-03
      • 2022-12-22
      • 1970-01-01
      • 1970-01-01
      • 2019-02-07
      • 2019-07-19
      相关资源
      最近更新 更多