如何在Spring Boot应用程序中配置自定义数据库连接超时?

时间:2019-04-04 08:31:51

标签: java spring spring-boot jdbc

在我的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文件覆盖超时?

谢谢。

2 个答案:

答案 0 :(得分:0)

至少要配置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

答案 1 :(得分:0)

取决于您的数据源,但是您可以尝试以下操作:

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