【问题标题】:Spring DBCP connection getting terminatedSpring DBCP 连接被终止
【发布时间】:2016-04-15 17:30:22
【问题描述】:

我有一个应用程序,其中数据库连接由 Spring 配置创建(然后传递给休眠)。以下是我们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 数据库连接会在一段时间后被网络设置关闭。我们最初认为关闭连接是因为连接处于空闲状态。我们添加了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 小时(不同)时,验证查询停止在服务器上执行,然后连接被网络设置关闭。

我的问题是添加validationQuery 保证,连接不是空闲的吗? 应用程序在第一次登录尝试时失败,没有数据库连接;但在 2-3 次尝试后有效。不知道这里发生了什么。

【问题讨论】:

    标签: java spring hibernate apache-commons-dbcp


    【解决方案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 获得了更好的稳定性。配置选项与 commons dbcp 实现非常接近(可能相同?),因此转换很容易。

    【讨论】:

    • 感谢您帮助我了解validationQuery。对于我的问题中的#2,实际上是 minEvictableIdleTimeMillis 导致validationQuery 无法运行。
    【解决方案2】:

    附带说明,C3P0 连接池库比 DBCP 好得多。过去我在使用 DBCP 时总是遇到问题,自从切换到 C3P0 后,到目前为止没有任何问题......

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

    【讨论】:

      猜你喜欢
      • 2021-07-01
      • 2019-03-02
      • 1970-01-01
      • 2019-03-03
      • 1970-01-01
      • 2012-05-13
      • 2012-12-22
      • 1970-01-01
      相关资源
      最近更新 更多