Grails 2.4.4: PooledConnection уже закрыт
Я пытался обновить мой проект с Grails 2.1.2 до Grails 2.4.4. Этот проект вызывает другой модуль (обновленный до Java 8), который использует ibatis для подключения к базе данных. Хотя модуль как автономный работает нормально, он дает мне исключение "Соединение закрыто" при доступе из проекта grails. Это приложение прекрасно работало на Grails 2.1.2 с Java 6. Однако обновление, похоже, что-то ломает.
Исключение: вызвано: java.sql.SQLException: PooledConnection уже закрыт. в org.apache.tomcat.jdbc.pool.DisposableConnectionFacade.invoke(DisposableConnectionFacade.java:86) в com.sun.proxy.$Proxy35.prepareStatement(неизвестный источник) в sun.reflect.GeneratedMethodAccessor354.invoke(неизвестный источник).reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) в java.lang.reflect.Method.invoke(Method.java:483) в org.springsource.loaded.ri.ReflectiveInterceptor.jlrMetor (Ref). org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy $ LazyConnectionInvocationHandler.invoke (LazyConnectionDataSourceProxy.java:376) в com.sun.proxy. $ Proxy37.prepareStatement (неизвестный источник). refle.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) по адресу java.lang.reflect.Method.invoke(Method.java:483) по адресу org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodavIntive.springframew ork.jdbc.datasource.TransactionAwareDataSourceProxy $ TransactionAwareInvocationHandler.invoke (TransactionAwareDataSourceProxy.java:240) в com.sun.proxy. Java: 87) в org.apache.ibatis.executor.statement.BaseStatementHandler.prepare (BaseStatementHandler.java:88) в org.apache.ibatis.executor.statement.RoutingStatementHandler.prepare (RoutingStatementHandler.java.ap at или org).ibatis.executor.SimpleExecutor.prepareStatement (SimpleExecutor.java:85) в org.apache.ibatis.executor.SimpleExecutor.doQuery (SimpleExecutor.java:62) в org.apache.ibatis.executor.BaseExecutor.queryFromDatabasejava (BaseExecutor): 324) в org.apache.ibatis.executor.BaseExecutor.query (BaseExecutor.java:156) в org.apache.ibatis.executor.BaseExecutor.query (BaseExecutor.java:136) в org.apache.ibatis.session. defaults.DefaultSqlSession.selectList (DefaultSqlSession.java:1 48) в org.apache.ibatis.session.defaults.DefaultSqlSession.selectList (DefaultSqlSession.java:141) в org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne (DefaultSqlSession.java:77) в sun.remplativeN.Imphod..invoke0 (собственный метод) в sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) в sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.javajlan.ho.j.f.j.f.: 483) в org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1270) в org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.j:50).
Я искал другие подобные вопросы онлайн, но я, кажется, не сталкиваюсь ни с одной из упомянутых проблем. Я не вижу никаких заброшенных соединений в моих журналах. Также со стороны БД я вижу, что два соединения еще живы (минимальное соединение в режиме ожидания установлено на 2).
DataSource.config:
dataSource {
pooled = true
driverClassName = "oracle.jdbc.driver.OracleDriver"
username = xxx
password = yyy
dialect = 'org.hibernate.dialect.Oracle10gDialect'
dbCreate = "none"
properties {
maxActive = 15
maxIdle = 5
minIdle = 2
initialSize = 8
minEvictableIdleTimeMillis = 60000
timeBetweenEvictionRunsMillis = 60000
maxWait = 10000
testOnBorrow = true
validationQuery = "select 1 from dual"
}
}
РЕДАКТИРОВАТЬ 1: После некоторой дополнительной отладки на моей стороне, я вижу, что проблема произошла после того, как мы обновили наш плагин tomcat до версии 7.0.55. Ранее мы использовали 2.1.2. Этот новый плагин использует jdbc-pool через JdbcInterceptor для создания соединений с БД. Это соединение затем отправляется во второй модуль (который использует ibatis)
РЕДАКТИРОВАТЬ 2: РЕШЕНО Мы попытались создать другой источник данных вокруг вышеупомянутой конфигурации источника данных, указывая его на c3p0 и поместил его в resources.groovy. Это было введено в модуль ibatis, и мы увидели, что на этот раз не было ошибки "Пул подключений закрыт". Это похоже на проблему с jdbc-pool, но мы хотели бы знать, есть ли какой-нибудь другой обходной путь.
Новый конфиг в resources.groovy:
dataSource_new (ComboPooledDataSource) { bean ->
idleConnectionTestPeriod = 1 * 60 * 60
testConnectionOnCheckin = true
bean.destroyMethod = 'close'
user = xxx
password = yyy
driverClass = <same as in datasource>
jdbcUrl = zzz
}
BuildConfig.groovy: compile ('com.mchange: c3p0: 0.9.5.1')