Grails 2.4.4:PooledConnection已经关闭

时间:2016-09-01 06:32:12

标签: java-8 connection-pooling ibatis grails-2.4

我一直在尝试将我的项目从grails 2.1.2升级到grails 2.4.4。该项目调用另一个模块(升级到java 8),该模块使用ibatis进行数据库连接。虽然该模块作为一个独立的工作正常,它给了我"连接已关闭"从grails项目访问时的异常。 这个应用程序在使用java 6的grails 2.1.2上运行良好。然而,升级似乎破坏了一些东西。

  

例外:   引起:java.sql.SQLException:PooledConnection已经关闭。       at org.apache.tomcat.jdbc.pool.DisposableConnectionFacade.invoke(DisposableConnectionFacade.java:86)       在com.sun.proxy。$ Proxy35.prepareStatement(未知来源)       at sun.reflect.GeneratedMethodAccessor354.invoke(未知来源)       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)       在java.lang.reflect.Method.invoke(Method.java:483)       at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1270)       在org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy $ LazyConnectionInvocationHandler.invoke(LazyConnectionDataSourceProxy.java:376)       at com.sun.proxy。$ Proxy37.prepareStatement(Unknown Source)       at sun.reflect.GeneratedMethodAccessor354.invoke(未知来源)       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)       在java.lang.reflect.Method.invoke(Method.java:483)       at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1270)       at org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy $ TransactionAwareInvocationHandler.invoke(TransactionAwareDataSourceProxy.java:240)       at com.sun.proxy。$ Proxy37.prepareStatement(Unknown Source)       at org.apache.ibatis.executor.statement.PreparedStatementHandler.instantiateStatement(PreparedStatementHandler.java:87)       at org.apache.ibatis.executor.statement.BaseStatementHandler.prepare(BaseStatementHandler.java:88)       在org.apache.ibatis.executor.statement.RoutingStatementHandler.prepare(RoutingStatementHandler.java:59)       在org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:85)       在org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:62)       at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:324)       在org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)       at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:136)       在org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148)       在org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)       在org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:77)       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)       at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)       在java.lang.reflect.Method.invoke(Method.java:483)       at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1270)       在org.mybatis.spring.SqlSessionTemplate $ SqlSessionInterceptor.invoke(SqlSessionTemplate.java:434)

我在网上搜索过其他类似的问题,但我似乎没有遇到任何提到的问题。我的日志中没有看到任何Abandoned连接。同样从数据库方面,我看到有两个连接仍处于活动状态(最小空闲连接设置为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(&#39; com.mchange:c3p0:0.9.5.1&#39;)

0 个答案:

没有答案