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')

0 ответов

Другие вопросы по тегам