如何在启动时预初始化DBCP连接池?

我的项目设置是 –

  1. Spring JDBC用于持久化
  2. Apache DBCP 1.4用于连接池
  3. Linux上的Mysql 5

这是我的应用程序的日志,它捕获与数据库的交互。

2013-01-29 15:52:21,549 DEBUG http-bio-8080-exec-3 org.springframework.jdbc.core.JdbcTemplate - Executing SQL query [SELECT id from emp] 2013-01-29 15:52:21,558 DEBUG http-bio-8080-exec-3 org.springframework.jdbc.datasource.DataSourceUtils - Fetching JDBC Connection from DataSource 2013-01-29 15:52:31,878 INFO http-bio-8080-exec-3 jdbc.connection - 1. Connection opened org.apache.commons.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:38) 2013-01-29 15:52:31,878 DEBUG http-bio-8080-exec-3 jdbc.connection - open connections: 1 (1) 2013-01-29 15:52:31,895 INFO http-bio-8080-exec-3 jdbc.connection - 1. Connection closed org.apache.commons.dbcp.DelegatingConnection.close(DelegatingConnection.java:247) 2013-01-29 15:52:31,895 DEBUG http-bio-8080-exec-3 jdbc.connection - open connections: none 2013-01-29 15:52:41,950 INFO http-bio-8080-exec-3 jdbc.connection - 2. Connection opened org.apache.commons.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:38) 2013-01-29 15:52:41,950 DEBUG http-bio-8080-exec-3 jdbc.connection - open connections: 2 (1) 2013-01-29 15:52:52,001 INFO http-bio-8080-exec-3 jdbc.connection - 3. Connection opened org.apache.commons.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:38) 2013-01-29 15:52:52,002 DEBUG http-bio-8080-exec-3 jdbc.connection - open connections: 2 3 (2) 2013-01-29 15:53:02,058 INFO http-bio-8080-exec-3 jdbc.connection - 4. Connection opened org.apache.commons.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:38) 2013-01-29 15:53:02,058 DEBUG http-bio-8080-exec-3 jdbc.connection - open connections: 2 3 4 (3) 2013-01-29 15:53:03,403 DEBUG http-bio-8080-exec-3 org.springframework.jdbc.core.BeanPropertyRowMapper - Mapping column 'id' to property 'id' of type int 2013-01-29 15:53:04,494 DEBUG http-bio-8080-exec-3 org.springframework.jdbc.datasource.DataSourceUtils - Returning JDBC Connection to DataSource 

从日志中可以清楚地看到两件事 –

  1. 连接池仅在收到第一个执行查询的请求时才开始创建连接。
  2. 一个由4个连接组成的池需要将近30秒的时间进行初始化。

我的问题是 –

  1. 如何配置DBCP在启动时自动初始化?
  2. 创建连接真的需要很长时间吗?

注意:请不要建议切换到C3P0或Tomcat连接池。 我知道那些解决方案。 我更感兴趣的是了解手头的问题,而不仅仅是快速修复。 除此之外,我确信DBCP也应该有一些基本的东西。

dbcontext的内容 –

           

在您首次请求连接之前,initialSize不会生效。 从java docs到BasicDataSource #setInitialSize

设置连接池的初始大小。

注意:一旦池初始化,此方法当前无效。 第一次调用以下方法之一时初始化池:getConnection,setLogwriter,setLoginTimeout,getLoginTimeout,getLogWriter。

尝试将init-method="getLoginTimeout"到bean中以确认这一点。

对于Web应用程序,您可以使用DataAccess层实现ServletContextListener.contextInitialized()方法并触发测试查询(例如,从Emp Limit 1中选择ID)。 这应该初始化您的连接池,并在您的应用程序开始从Web提供真实用户之前使其准备就绪。

查看initialSize属性 – 特别是有关何时初始化池的部分。 正如sbridges指出的那样,您可以使用bean上的init-method属性来调用其中一个方法来触发池创建。

此外,您应该查看为什么平均需要7.5秒才能创建连接…

干杯,