我一直在试图从升级2.1.2的Grails我的项目的Grails 2.4.4。 该项目需要它使用iBatis的数据库连接另一模块(升级到Java 8)。 虽然模块作为一个独立工作正常,从Grails项目进行访问时,它给我“连接已关闭”异常。 这个应用程序已经在Grails的2.1.2与Java 6.但做工精细,升级似乎被打破的东西。
异常:java.sql.SQLException中:通过引起的PooledConnection已经关闭。 在Sun的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.jlrMethodInvoke(ReflectiveInterceptor.java:1270)在org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy $ LazyConnectionInvocationHandler.invoke(LazyConnectionDataSourceProxy.java:376)在com.sun.proxy。$ Proxy37.prepareStatement(来源不明)在sun.reflect.GeneratedMethodAccessor354.invoke(来源不明)在阳光下。 reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)在java.lang.reflect.Method.invoke(Method.java:483)在org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1270)在组织.springframew ork.jdbc.datasource.TransactionAwareDataSourceProxy $ TransactionAwareInvocationHandler.invoke(TransactionAwareDataSourceProxy.java:240)在com.sun.proxy。$ Proxy37.prepareStatement(来源不明)在org.apache.ibatis.executor.statement.PreparedStatementHandler.instantiateStatement(PreparedStatementHandler。的java:87)在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)在org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java :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.reflect.NativeMethodAccessorImpl .invoke0(本机方法)在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)在java.lang.reflect.Method.invoke(Method.java :483)在org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1270)在org.mybatis.spring.SqlSessionTemplate $ SqlSessionInterceptor.invoke(SqlSessionTemplate.java:434)
我已经寻找其他类似的问题,在网上,但我不似乎面临任何提到的问题。 我没有看到我的日志任何废弃的连接。 也从侧面DB我看到有两个连接还活着(最低空闲连接设置为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池通过JdbcInterceptor创建数据库连接。 此连接,然后被发送到所述第二模块(使用ibatis的)
编辑2:解决我们试图创建一个围绕上述数据源配置其指向C3P0不同的数据源,并把它放在resources.groovy。 这被注入到iBatis的模块,我们看到,这一次没有“连接池关闭”的错误。 这似乎是一些问题与JDBC池,但我们想知道,如果有一些其他的解决办法。
在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')