web-dev-qa-db-ja.com

Spring Bootアプリケーションでカスタムデータベース接続タイムアウトを構成するにはどうすればよいですか?

私の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ファイルでオーバーライドできない理由を誰かが知っていますか?

前もって感謝します。

4
yordanoff

構成するタイムアウトは少なくとも3つあります。

  1. すでに行ったトランザクションタイムアウト。私はtransactionManager Beanで自分を宣言しました。
txManager.setDefaultTimeout(myDefaultValue);
  1. クエリのタイムアウト(明らかに@transactionalは必要ありません)。これは既に行っており、説明もされています here

  2. ネットワークタイムアウト(これをお読みください 優れた記事 )。

私の場合、私は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
jumping_monkey

データソースによって異なりますが、これを試すことができます:

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