Tomcat JNDI PSQLException:此连接已关闭

时间:2015-02-09 16:04:28

标签: java hibernate postgresql tomcat grails

我们已经部署了几个在同一个tomcat容器中运行的应用程序,并通过JNDI查找连接到我们的postgresql数据库。这是已清理的配置(server.xml):

<Resource name="MyDataSource" 
    auth="Container"
    type="javax.sql.DataSource"
    driverClassName="org.postgresql.Driver" 
    url="jdbc:postgresql://myrdsinstance.com:5432/MyDatabase"
    username="my_username"
    password="my_password" />

这几个月都运行良好,但今天早上任何尝试阅读数据库都失败了:

org.postgresql.util.PSQLException: This connection has been closed.
org.postgresql.jdbc2.AbstractJdbc2Connection.checkClosed(AbstractJdbc2Connection.java:843)
org.postgresql.jdbc2.AbstractJdbc2Connection.getAutoCommit(AbstractJdbc2Connection.java:804)
sun.reflect.GeneratedMethodAccessor1079.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:606)
org.apache.tomcat.jdbc.pool.ProxyConnection.invoke(ProxyConnection.java:126)
org.apache.tomcat.jdbc.pool.JdbcInterceptor.invoke(JdbcInterceptor.java:109)
org.apache.tomcat.jdbc.pool.DisposableConnectionFacade.invoke(DisposableConnectionFacade.java:80)
com.sun.proxy.$Proxy30.getAutoCommit(Unknown Source)
org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doBegin(JdbcTransaction.java:68)
org.hibernate.engine.transaction.spi.AbstractTransactionImpl.begin(AbstractTransactionImpl.java:160)
org.hibernate.internal.SessionImpl.beginTransaction(SessionImpl.java:1309)
org.hibernate.ejb.TransactionImpl.begin(TransactionImpl.java:57)
org.springframework.orm.jpa.DefaultJpaDialect.beginTransaction(DefaultJpaDialect.java:70)
org.springframework.orm.jpa.vendor.HibernateJpaDialect.beginTransaction(HibernateJpaDialect.java:59)
org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:377)
org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:371)

临时修复是重新启动tomcat7服务,我假设重新打开已关闭的数据库连接。但现在我正在调查根本原因,并希望能够长期解决问题。我从catalina.out找到了

2015-02-09 14:15:55,260 WARN [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] - SQL Error: 0, SQLState: 08003

the PostgreSQL error codes doc我知道这意味着connection_does_not_exist

我做了一些谷歌搜索,找不到与这个确切问题有关的内容。我认为如果连接关闭,它将由JDBC,Hibernate甚至GORM(用于grails应用程序)处理。我错过了一些明显的东西吗?

1 个答案:

答案 0 :(得分:1)

检查BasicDataSourcecommons-dbcp的代码,我得出的结论是,通过指定validationQuery作为数据源的属性,我们允许容器验证连接在到达我们的代码之前是有效的。当然,在tomcat验证连接到达我们的代码之间连接变得无效的可能性很小,因此这种解决方案并不理想。简而言之:

<Resource name="MyDataSource" 
    auth="Container"
    type="javax.sql.DataSource"
    driverClassName="org.postgresql.Driver" 
    url="jdbc:postgresql://myrdsinstance.com:5432/MyDatabase"
    username="my_username"
    password="my_password"
    validationQuery="SELECT 1" />

希望有一个比这个更好的解决方案,但我想我会发布我们为其他任何其他google做的事情。