当前位置: 首页 > 知识库问答 >
问题:

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

蒋阳华
2023-03-14

我的项目的设置是-

  1. 用于持久化的Spring JDBC

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

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也应该可以实现如此基本的东西。

db上下文的内容-

<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>

共有3个答案

微生俊捷
2023-03-14

请查看初始大小属性,特别是关于何时初始化池的部分。正如sbridge所指出的,您可以使用bean上的init-method属性来调用其中一个方法来触发池创建。

此外,你应该研究为什么平均需要7.5秒来创建一个连接...

干杯,

乔鸿骞
2023-03-14

对于web应用程序,可以实现ServletContextListener。contextInitialized()方法并使用数据访问层启动测试查询(例如,从Emp Limit 1中选择ID)。这应该初始化您的连接池,并在应用程序开始从web为实际用户提供服务之前做好准备。

郭修平
2023-03-14

在您第一次请求连接之前,首字母大小不会生效。从java文档到BasicDataSource#set初始大小

设置连接池的初始大小。

注意:此方法目前在池初始化后无效。首次调用以下方法之一时初始化池:getConnection、setLogWriter、setLoginTimeout、getLoginTimeout、getLogWriter。

尝试将init method=“getLoginTimeout”添加到bean中以确认这一点。

 类似资料:
  • 我按照步骤创建了HelloWorld示例,但它没有运行。它给出了以下错误: 初始化引导层java.lang.module.FindException时出错:读取模块:F:\Develop\Eclipse\HelloWorld\bin时出错,原因是:java.lang.module.InvalidModuleDescriptoRexception:HelloWorld.class在顶级目录中找到(模

  • 问题内容: 我正在从Jersey 1.x移植一些代码,我各种Health Check终结点的实现都依赖于在启动时初始化的所有终结点资源,以便能够检测要执行的检查。 在Jersey 2.0中,无论执行什么操作,我似乎都无法在启动时初始化我的资源端点,并且仅在首次访问每个端点时才对它们进行构造和初始化。 我想我可以在课堂上自己初始化它们,但我更喜欢使用包扫描! 是否有人知道是否有一些配置选项可以告诉J

  • 所以我最近在我的win10 PC上安装了eclipse,并创建了一个公共类。代码如下: 接下来,显示了一个错误: 然后,我删除了info.java文件,并显示以下错误: 我能做些什么来解决这个问题?

  • 问题内容: 我想在Web应用程序启动时加载属性文件并设置连接池。显然,我只想在一个地方进行一次,因此可以根据需要进行更改。对于常规的servlet,我只需将初始化代码放在servlet的init()方法中,但是您无法使用Jersey servlet对其进行访问。那么我在哪里做呢?上面链接中的侦听器如何工作? 问题答案: 您需要做的就是编写一个实现ServletContextListener接口的J

  • 我正在使用DBCP连接池,并创建了一个MBean来在Jconsole中显示连接池的统计信息。我观察到的是,即使应用程序上没有活动(意味着没有页面点击等),连接池统计数据也会显示活动连接。 我们在上面看到的16个虚拟连接并没有降到零。我不知道为什么?有人能解释一下吗? 谢谢