Theo như tôi hiểu, các tham số "testOnBorrow" và "validationQuery" nằm ngay trên hẻm của tôi nhưng chúng dường như không hoạt động như mong đợi.Tự động kết nối lại ở hậu kỳ với hồ bơi tomcat và Spring
Tôi khởi động ứng dụng, chạy một số truy vấn và mọi thứ đều ổn. Sau đó, tôi khởi động lại máy chủ postgres - mà không cần khởi động lại tomcat - để kiểm tra DataSource có thể xử lý việc tái kết nối và tất cả tôi nhận được là:
This connection has been closed.; nested exception is org.postgresql.util.PSQLException: This connection has been closed.
at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:104)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:603)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:637)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:666)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:674)
at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:729)
...
Caused by: org.postgresql.util.PSQLException: This connection has been closed.
at org.postgresql.jdbc2.AbstractJdbc2Connection.checkClosed(AbstractJdbc2Connection.java:822)
at org.postgresql.jdbc3.AbstractJdbc3Connection.prepareStatement(AbstractJdbc3Connection.java:273)
at org.postgresql.jdbc2.AbstractJdbc2Connection.prepareStatement(AbstractJdbc2Connection.java:301)
at sun.reflect.GeneratedMethodAccessor38.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.apache.tomcat.jdbc.pool.ProxyConnection.invoke(ProxyConnection.java:126)
at org.apache.tomcat.jdbc.pool.JdbcInterceptor.invoke(JdbcInterceptor.java:99)
at org.apache.tomcat.jdbc.pool.interceptor.AbstractCreateStatementInterceptor.invoke(AbstractCreateStatementInterceptor.java:67)
at org.apache.tomcat.jdbc.pool.JdbcInterceptor.invoke(JdbcInterceptor.java:99)
at org.apache.tomcat.jdbc.pool.interceptor.ConnectionState.invoke(ConnectionState.java:153)
at org.apache.tomcat.jdbc.pool.JdbcInterceptor.invoke(JdbcInterceptor.java:99)
at org.apache.tomcat.jdbc.pool.TrapException.invoke(TrapException.java:41)
at org.apache.tomcat.jdbc.pool.JdbcInterceptor.invoke(JdbcInterceptor.java:99)
at org.apache.tomcat.jdbc.pool.DisposableConnectionFacade.invoke(DisposableConnectionFacade.java:63)
at $Proxy35.prepareStatement(Unknown Source)
at org.springframework.jdbc.core.JdbcTemplate$SimplePreparedStatementCreator.createPreparedStatement(JdbcTemplate.java:1436)
Tôi đang sử dụng:
- Xuân 3.1
- PostgreSQL 9.2.1
- Pool kết nối: org.apache.tomcat.jdbc.pool 7.0.25
My Spring bean conf iguration là như sau:
public DataSource dataSource() {
org.apache.tomcat.jdbc.pool.DataSource dataSource = new org.apache.tomcat.jdbc.pool.DataSource();
// from properties file
dataSource.setDriverClassName(environment
.getProperty("datasource.driver"));
dataSource.setUrl(environment.getProperty("datasource.url"));
dataSource.setUsername(environment.getProperty("datasource.username"));
dataSource.setPassword(environment.getProperty("datasource.password"));
// other configurations
dataSource.setInitialSize(10);
dataSource.setMinIdle(10);
dataSource.setMaxIdle(100);
dataSource.setMaxActive(100);
dataSource.setDefaultAutoCommit(true);
dataSource.setMaxWait(6000);
dataSource.setJmxEnabled(true);
dataSource
.setJdbcInterceptors("....ConnectionState;.....StatementFinalizer");
dataSource.setRemoveAbandoned(true);
dataSource.setRemoveAbandonedTimeout(10);
dataSource.setLogAbandoned(true);
dataSource.setTestOnBorrow(true);
dataSource.setTestOnReturn(false);
dataSource.setTestWhileIdle(false);
dataSource.setUseEquals(false);
dataSource.setFairQueue(false);
dataSource.setTimeBetweenEvictionRunsMillis(30000);
dataSource.setMinEvictableIdleTimeMillis(30000);
dataSource.setValidationInterval(1800000);
dataSource.setValidationQuery("SELECT 1");
return dataSource;
}
Bất kỳ ý tưởng nào?
Cảm ơn