Spring DBCP连接终止

时间:2016-04-15 17:30:23

标签: java spring hibernate apache-commons-dbcp

我有一个应用程序,其中数据库连接由Spring配置创建(然后传递给hibernate)。以下是我们的spring文件中的默认参数。

<bean id="localDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName">
    <value>${database.driver}</value>
    </property>
    <property name="url">
    <value>${dbUrl}</value>
    </property>
    <property name="username">
    <value>${dbUser}</value>
    </property>
    <property name="password">
    <value>${dbPassword}</value>
    </property>
</bean>

但是,在特定环境中,Oracle DB连接在一段时间后会被网络设置关闭。我们最初认为连接的关闭是因为连接空闲。我们添加了validationQuery以定期在服务器上发布查询,以便连接不会空闲。

<bean id="localDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName">
    <value>${database.driver}</value>
    </property>
    <property name="url">
    <value>$dbUrl</value>
    </property>
    <property name="username">
    <value>$dbUser</value>
    </property>
    <property name="password">
    <value>$dbPassword</value>
    </property>
    <property name="validationQuery">
    <value>SELECT 1 FROM dual</value>
    </property>
    <property name="testWhileIdle">
    <value>true</value>
    </property>
    <property name="testOnReturn">
    <value>true</value>
    </property>
    <property name="timeBetweenEvictionRunsMillis">
    <value>1000</value>
    </property>
</bean>
  1. 即使在上述设置之后,连接仍然关闭。
  2. 还观察到,当应用程序空闲2-3(不同)小时时,验证查询将停止在服务器上执行,然后网络设置将关闭连接。
  3. 我的问题是添加validationQuery保证,连接没有空闲吗? 首次登录尝试时,应用程序失败,没有数据库连接;但是在2-3次尝试之后工作。不知道这里发生了什么。

2 个答案:

答案 0 :(得分:1)

validationQuery仅用于在从连接池中检索连接时测试连接。请参阅:https://commons.apache.org/proper/commons-dbcp/configuration.html

另外,我在org.apache.commons.dbcp.BasicDataSource和Oracle(11和12)中看到了一些奇怪的行为。我们使用org.apache.tomcat.dbcp.dbcp.BasicDataSource获得了更好的稳定性。配置选项与公共dbcp实现非常接近(可能相同?),因此转换非常简单。

答案 1 :(得分:0)

另一方面,C3P0连接池库比DBCP好得多。我以前一直在与DBCP发生过问题,从那时起就没有问题切换到C3P0 ......

http://www.mchange.com/projects/c3p0/