java.sql.SQLException: 连接已关闭

8

在执行事务时,我们偶尔会遇到 java.sql.SQLException: Connection has already been closed. 异常。我们使用的是 tomcat 7.X,以下是配置:

<Context docBase="ROOT" reloadable="true" antiJARLocking="true">
        <Resource
                name="jdbc/DS"
                auth="Container"
                type="javax.sql.DataSource"
                driverClassName="org.postgresql.Driver"
                url="jdbc:postgresql://XXXXXXX"
                factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
                username="XXXXXX"
                password="XXXXXX"
                maxActive="20"
                maxIdle="3"
                minIdle="3"
                maxWait="10000"
                removeAbandoned="true"/>
</Context>

可能我们在这里缺少一些配置或属性导致了这个问题。

请建议一种解决此问题的方法或帮助找出根本原因。


这是发生在大量数据还是小数量数据中? - puneet goyal
1
当我们处理大量数据时,就会出现这种情况。 - Mukesh Kumar
2个回答

7

以下配置适用于我:

<Context context="ROOT" debug="0" reloadable="false" useHttpOnly="true" cacheMaxSize="40960" cacheTTL="60000" cachingAllowed="true" antiJARLocking="true">
    <Resource name="XYZ" auth="Container"
            description="Exchange DB Connection"
            dataSourceClassName="org.postgresql.ds.PGSimpleDataSource"
            dataSource.serverName="XXXXX"
            dataSource.databaseName="XXXX"
            dataSource.portNumber="XXXX"
            dataSource.user="xyz"
            dataSource.password="xyz"
            maximumPoolSize="20"
            minimumIdle="5"
            connectionTimeout="300000"
            factory="com.zaxxer.hikari.HikariJNDIFactory"
            registerMbeans="true"
            type="javax.sql.DataSource" />

这里的关键值是connectionTimeout。 您目前使用的工厂具有默认超时时间,超过此时间后会强制关闭会话。

上述连接超时值对我有效,对于您的应用程序场景,您需要进行一些实验来获取正确的值。


0

添加以下数值:

removeAbandonedTimeout="600"

如果将removeAbandoned设置为“true”,则它以秒为单位工作,默认值为60。要了解更多信息,请访问:https://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html#JNDI_Factory_and_Type - hello_earth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接