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

标签 java database-connection connection-pooling spring-jdbc apache-commons-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 的内容 -

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="${db.driver}" />
    <property name="url" value="${db.jdbc.url}" />
    <property name="username" value="${db.user}" />
    <property name="password" value="${db.password}" />
    <property name="maxActive" value="20" />
    <property name="initialSize" value="4" />
    <property name="testOnBorrow" value="true" />
    <property name="validationQuery" value="SELECT 1" />
</bean>

最佳答案

在您第一次请求连接之前,initialSize 不会生效。从 java 文档到 BasicDataSource#setInitialSize

Sets the initial size of the connection pool.

Note: this method currently has no effect once the pool has been initialized. The pool is initialized the first time one of the following methods is invoked: getConnection, setLogwriter, setLoginTimeout, getLoginTimeout, getLogWriter.

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

关于java - 如何在启动时预初始化 DBCP 连接池?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14581201/

相关文章:

java - 在 Tomcat 上配置 SQL Server 连接池

java - Groovy - 如何创建内部包含变量的路径目录

java - 将编辑文本输入转换为整数

asp.net - 无法从 ASP.NET 应用程序连接到 Informix

java - ConnectionPoolSetting 是针对单个 mongos 实例还是针对整个集群?

mysql - NodeJs - 如何在我的模型之间共享 MySQL 池以避免 'ER_CON_COUNT_ERROR'

Java 服务器未释放连接锁

java - Ant 不使用我的 JAVA_HOME 来查找 tools.jar

sql-server - Microsoft SQL 服务器,错误 : 18456 by login with "sa" through SQL Server Authentication

asp.net - 连接字符串-不支持关键字:“初始目录”