我一直在尝试将我的项目从 grails 2.1.2 升级到 grails 2.4.4。该项目调用了另一个模块(升级到 java 8),它使用 ibatis 进行数据库连接。虽然模块作为独立的工作正常,但从 grails 项目访问时,它会给我“连接关闭”异常。这个应用程序在带有 java 6 的 grails 2.1.2 上运行良好。但是,升级似乎破坏了一些东西。
异常:原因:java.sql.SQLException:PooledConnection 已关闭。在 org.apache.tomcat.jdbc.pool.DisposableConnectionFacade.invoke(DisposableConnectionFacade.java:86) 在 com.sun.proxy.$Proxy35.prepareStatement(Unknown Source) 在 sun.reflect.GeneratedMethodAccessor354.invoke(Unknown Source) 在 sun .reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:483) at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1270) at org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy$LazyConnectionInvocationHandler.invoke(LazyConnectionDataSourceProxy.java:376) 在 com.sun.proxy.$Proxy37.prepareStatement(Unknown Source) 在 sun.reflect.GeneratedMethodAccessor354。
我在网上搜索了其他类似的问题,但我似乎没有遇到提到的任何问题。我的日志中没有看到任何已放弃的连接。同样从数据库方面我看到有两个连接仍然存在(最小空闲连接设置为 2)。
数据源.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。这个新插件通过 JdbcInterceptor 使用 jdbc-pool 来创建数据库连接。然后将此连接发送到第二个模块(使用 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: 编译('com.mchange:c3p0:0.9.5.1')