首页 > 解决方案 > Tomcat 连接池问题 - 无法在关闭的连接上调用方法

问题描述

我的应用程序使用 Spring 2.5.x 并部署在 Tomcat 服务器上。有时,当我的数据库连接空闲时,我会收到以下错误:

[TeraJDBC 14.00.00.13] [错误 1095] [SQLState HY000] 无法在关闭的连接上调用方法

这是数据源配置

<bean id="dataSource"   class="org.apache.tomcat.jdbc.pool.DataSource"
          destroy-method="close">
    <property name="driverClassName" value="com.teradata.jdbc.TeraDriver"/>
    <property name="url" >
        <util:constant static-field="_DB_HOST"/>
    </property>
    <property name="username">
        <util:constant static-field="_DB_USER"/>
    </property>
    <property name="password">
        <util:constant static-field="_DB_PWD"/>
    </property>
    <property name="initialSize" value="1" />
    <property name="maxActive" value="50" />
</bean>

我在这里缺少任何配置吗?

标签: javaspringtomcat

解决方案


虽然 Spring 使用的所有连接JdbcTemplate都在每个事务结束时关闭,但 Tomcat 的JDBC 连接池实际上从不返回Connection驱动程序获得的 real 。DataSource#getConnection总是返回一个代理,以便Connection#close返回到池的连接而不是物理关闭它。

因此,正如本答案中所解释的,连接可能已被服务器关闭。因此,您需要配置池以验证连接,如Kayaman 引用的答案

我怀疑您的问题不是由连接问题引起的,而是由服务器策略引起的,所以我会设置:

<property name="validationQuery" value="SELECT 66353343" /> 
<property name="testWhileIdle" value="true" />
<property name="timeBetweenEvictionRunsMillis" value="60000" />

为了每 60 秒检查一次物理连接是否正常。


推荐阅读