如何在春季 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。当用户在我的spring应用程序上发出请求时,将为他打开一个数据库连接。完成请求后,spring jpa 会关闭此连接吗?如果没有,它何时会关闭未使用的连接?

我已经通读了 http://docs.spring.io/spring-data/jpa/docs/current/reference/html/ 的春季jpa参考文件。但它没有提到任何关于连接的事情。


答案 1

使用数据库连接池时,调用 不一定关闭与数据库的重量级连接,而是最常将连接释放为池中可重用的连接。这就是为什么在利用客户端连接池时,建议尽快调用 on 连接的原因。sqlconnection.close()close()

在配置中,池将包含最多 500 个连接(配置 、 和 调整即用型连接的数量以及在不使用时释放它们的频率也是很好的)。maxIdleminIdleminEvictableIdleTimeMillis

更多文档请点击这里


答案 2

您已经发现可以从中配置此属性 您可以在此处找到所有可能的属性。application.properties

请注意,从Spring Boot 1.4开始,Spring与之集成的每个数据源供应商都有数据源属性,开箱即用。有 ,依此类推。查看 1.4 文档spring.datasource.dbcp.*spring.datasource.tomcat.*

如果这还不够,并且您需要一些非常具体的东西,您可以自己声明数据源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 ;
}

推荐