我一直在尝试将我的项目从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;)