我有一个应用程序,其中数据库连接由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>
我的问题是添加validationQuery保证,连接没有空闲吗? 首次登录尝试时,应用程序失败,没有数据库连接;但是在2-3次尝试之后工作。不知道这里发生了什么。
答案 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 ......