web-dev-qa-db-ja.com

Spring JPAでデータベース接続プールを管理する方法は?

Webアプリケーションでspring-bootを使用し、spring-jpaを使用してデータベースの読み取り/書き込みを行っています。うまく機能しますが、データベース接続の管理方法を理解したいと思います。以下は、データベースのプロパティ設定です。

spring.datasource.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf8
spring.datasource.username=user
spring.datasource.password=pwd
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.max-active=500

最大接続数を500に設定しました。ユーザーが私の春のアプリケーションで要求を行うと、データベース接続が彼のために開かれます。リクエストの完了後、JPAはこの接続を閉じますか?そうでない場合、未使用の接続はいつ閉じられますか?

http://docs.spring.io/spring-data/jpa/docs/current/reference/html/ からspring jpaリファレンスドキュメントを読みました。しかし、接続については何も言及していません。

16
Zhao Yi

DB接続プーリングを使用する場合、sqlconnection.close()への呼び出しは、必ずしもデータベースへのヘビーウェイト接続を閉じるわけではなく、ほとんどの場合、プールで再利用可能な接続を解放するだけです。そのため、クライアント側の接続プールを利用する場合は、できるだけ早く接続時にclose()を呼び出すことをお勧めします。

構成では、プールには最大500個の接続が含まれます(maxIdleminIdle、およびminEvictableIdleTimeMillisを構成して、準備完了の数を調整することもできます。使用する接続と、使用されていないときにそれらを解放する頻度)。

いくつかのドキュメント こちら

14
guido

application.propertiesからこれを設定できることがすでにわかっています。すべての可能なプロパティを見つけることができます here

Spring Boot 1.4からは、すぐに統合できるすべてのデータソースベンダーのデータソースプロパティがあります。 spring.datasource.dbcp.*spring.datasource.Tomcat.*などがあります。 1.4 docs を参照してください

それだけでは不十分で、非常に具体的なものが必要な場合は、データソースBeanを自分で宣言できます。 Tomcatデータソースの例を次に示します。

@Bean
public DataSource dataSource(){
     PoolProperties p = new PoolProperties();
          p.setUrl("jdbc:mysql://localhost:3306/mysql");
          p.setDriverClassName("com.mysql.jdbc.Driver");
          p.setUsername("root");
          p.setPassword("password");
          p.setJmxEnabled(true);
          p.setTestWhileIdle(false);
          p.setTestOnBorrow(true);
          p.setValidationQuery("SELECT 1");
          p.setTestOnReturn(false);
          p.setValidationInterval(30000);
          p.setTimeBetweenEvictionRunsMillis(30000);
          p.setMaxActive(100);
          p.setInitialSize(10);
          p.setMaxWait(10000);
          p.setRemoveAbandonedTimeout(60);
          p.setMinEvictableIdleTimeMillis(30000);
          p.setMinIdle(10);
          p.setLogAbandoned(true);
          p.setRemoveAbandoned(true);
          p.setJdbcInterceptors(
            "org.Apache.Tomcat.jdbc.pool.interceptor.ConnectionState;"+
            "org.Apache.Tomcat.jdbc.pool.interceptor.StatementFinalizer");
          DataSource datasource = new DataSource();
          datasource.setPoolProperties(p);
          return datasource ;
}
12
Evgeni Dimitrov