有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Tomcat连接池问题无法在关闭的连接上调用方法

我的应用程序使用Spring2.5。并部署在Tomcat服务器上。有时,当我的数据库连接空闲时,会出现以下错误:

[TeraJDBC 14.00.00.13] [Error 1095] [SQLState HY000] Cannot call a method on closed connection

这是数据源配置

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

这里有我缺少的配置吗


共 (1) 个答案

  1. # 1 楼答案

    虽然Spring的JdbcTemplate使用的所有连接在每个事务结束时都会关闭,但Tomcat的JDBC Connection Pool永远不会返回驱动程序获得的实际ConnectionDataSource#getConnection总是返回一个代理,这样Connection#close就返回到池的连接,而不是物理地关闭它

    因此,正如this answer中所解释的,连接可能被服务器关闭。因此,您需要配置池来验证连接,如answer cited by Kayaman

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

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

    以便每60秒检查一次物理连接是否正常