2015-02-09 82 views
0

我們已經部署了幾個在同一個tomcat容器中運行的應用程序,並通過JNDI查找連接到我們的postgresql數據庫。這裏的消毒配置(server.xml):Tomcat JNDI PSQLException:此連接已關閉

<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應用程序)來處理。我在這裏錯過了很明顯的東西嗎

回答

0

檢查BasicDataSource的代碼commons-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員工在那裏。

相關問題