Hi guys,
I'm trying to integrate Spring ACL in my application. I use C3P0 for connection pooling, and Spring ACL uses JDBCTemplate, which requires a data-source, so I pass my ComboPooledDataSource. The problem is that to load the ACL rules the basic lookup strategy calls JDBCTemplate, which loads the ACL rules but then closes the connection! And I use this connection to continue the execution of the method, but because it is closed C3P0 throws "You cannot operate on a closed connection!" exception, so Spring tries to rollback the transaction and then finally a null-pointer is raised, because the connection that we try to rollback is already closed.
To debug this you have to use the latest C3P0 (version 0.9.5-pre3-SNAPSHOT from here https://oss.sonatype.org/content/rep...pre3-SNAPSHOT/) which contains a new data-source class called
and the stack trace that I get is:
From here:
and here(JDBCTemplate line 610):
I can clearly see that the JDBCTemplate is always closing the connection. Does this mean that I can't use JDBCTemplate with C3P0? Also, does this mean that I can't use ACL in my project?
If you want to debug I have a zip file that I can give you.
Thanks a lot for your time.
I'm trying to integrate Spring ACL in my application. I use C3P0 for connection pooling, and Spring ACL uses JDBCTemplate, which requires a data-source, so I pass my ComboPooledDataSource. The problem is that to load the ACL rules the basic lookup strategy calls JDBCTemplate, which loads the ACL rules but then closes the connection! And I use this connection to continue the execution of the method, but because it is closed C3P0 throws "You cannot operate on a closed connection!" exception, so Spring tries to rollback the transaction and then finally a null-pointer is raised, because the connection that we try to rollback is already closed.
To debug this you have to use the latest C3P0 (version 0.9.5-pre3-SNAPSHOT from here https://oss.sonatype.org/content/rep...pre3-SNAPSHOT/) which contains a new data-source class called
Code:
com.mchange.v2.c3p0.debug.AfterCloseLoggingComboPooledDataSource
Code:
2013-05-22 08:28:31,159 [http-bio-8080-exec-4] DEBUG com.mchange.v2.c3p0.debug.AfterCloseLoggingConnectionWrapper - Original close() call stack trace:
java.sql.SQLWarning: DEBUG STACK TRACE -- com.mchange.v2.c3p0.impl.NewProxyConnection@21b56626.close() first-call stack trace.
at com.mchange.v2.c3p0.debug.AfterCloseLoggingConnectionWrapper$AfterCloseLoggingInvocationHandler.invoke(AfterCloseLoggingConnectionWrapper.java:77)
at $Proxy30.close(Unknown Source)
at org.springframework.jdbc.support.JdbcUtils.closeConnection(JdbcUtils.java:67)
at org.springframework.orm.jpa.vendor.HibernateJpaDialect$HibernateConnectionHandle.releaseConnection(HibernateJpaDialect.java:169)
at org.springframework.jdbc.datasource.ConnectionHolder.released(ConnectionHolder.java:193)
at org.springframework.jdbc.datasource.DataSourceUtils.doReleaseConnection(DataSourceUtils.java:323)
at org.springframework.jdbc.datasource.DataSourceUtils.releaseConnection(DataSourceUtils.java:294)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:610)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:637)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:666)
at org.springframework.security.acls.jdbc.BasicLookupStrategy.lookupObjectIdentities(BasicLookupStrategy.java:341)
at org.springframework.security.acls.jdbc.BasicLookupStrategy.readAclsById(BasicLookupStrategy.java:303)
at org.springframework.security.acls.jdbc.JdbcAclService.readAclsById(JdbcAclService.java:109)
at org.springframework.security.acls.jdbc.JdbcAclService.readAclById(JdbcAclService.java:94)
at org.springframework.security.acls.AclPermissionEvaluator.checkPermission(AclPermissionEvaluator.java:81)
at org.springframework.security.acls.AclPermissionEvaluator.hasPermission(AclPermissionEvaluator.java:59)
at org.springframework.security.access.expression.SecurityExpressionRoot.hasPermission(SecurityExpressionRoot.java:129)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.springframework.expression.spel.support.ReflectiveMethodExecutor.execute(ReflectiveMethodExecutor.java:69)
at org.springframework.expression.spel.ast.MethodReference.getValueInternal(MethodReference.java:172)
at org.springframework.expression.spel.ast.SpelNodeImpl.getValue(SpelNodeImpl.java:134)
at org.springframework.expression.spel.ast.OpOr.getBooleanValue(OpOr.java:50)
at org.springframework.expression.spel.ast.OpOr.getValueInternal(OpOr.java:41)
at org.springframework.expression.spel.ast.OpOr.getValueInternal(OpOr.java:33)
at org.springframework.expression.spel.ast.SpelNodeImpl.getValue(SpelNodeImpl.java:134)
at org.springframework.expression.spel.ast.OpOr.getBooleanValue(OpOr.java:50)
at org.springframework.expression.spel.ast.OpOr.getValueInternal(OpOr.java:41)
at org.springframework.expression.spel.ast.OpOr.getValueInternal(OpOr.java:33)
at org.springframework.expression.spel.ast.SpelNodeImpl.getTypedValue(SpelNodeImpl.java:102)
at org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:98)
at org.springframework.security.access.expression.ExpressionUtils.evaluateAsBoolean(ExpressionUtils.java:11)
at org.springframework.security.access.expression.method.ExpressionBasedPreInvocationAdvice.before(ExpressionBasedPreInvocationAdvice.java:41)
at org.springframework.security.access.prepost.PreInvocationAuthorizationAdviceVoter.vote(PreInvocationAuthorizationAdviceVoter.java:54)
at org.springframework.security.access.prepost.PreInvocationAuthorizationAdviceVoter.vote(PreInvocationAuthorizationAdviceVoter.java:24)
at org.springframework.security.access.vote.UnanimousBased.decide(UnanimousBased.java:77)
at org.springframework.security.access.intercept.AbstractSecurityInterceptor.beforeInvocation(AbstractSecurityInterceptor.java:206)
at org.springframework.security.access.intercept.aopalliance.MethodSecurityInterceptor.invoke(MethodSecurityInterceptor.java:60)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
at $Proxy38.test(Unknown Source)
at com.facades.TestFacadeImpl.test(TestFacadeImpl.java:24)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
at $Proxy40.test(Unknown Source)
at com.controller.TestController.home(TestController.java:33)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
Code:
2013-05-22 08:28:31,159 [http-bio-8080-exec-4] DEBUG com.mchange.v2.c3p0.debug.AfterCloseLoggingConnectionWrapper - Original close() call stack trace:
java.sql.SQLWarning: DEBUG STACK TRACE -- com.mchange.v2.c3p0.impl.NewProxyConnection@21b56626.close() first-call stack trace.
at com.mchange.v2.c3p0.debug.AfterCloseLoggingConnectionWrapper$AfterCloseLoggingInvocationHandler.invoke(AfterCloseLoggingConnectionWrapper.java:77)
at $Proxy30.close(Unknown Source)
at org.springframework.jdbc.support.JdbcUtils.closeConnection(JdbcUtils.java:67)
at org.springframework.orm.jpa.vendor.HibernateJpaDialect$HibernateConnectionHandle.releaseConnection(HibernateJpaDialect.java:169)
at org.springframework.jdbc.datasource.ConnectionHolder.released(ConnectionHolder.java:193)
at org.springframework.jdbc.datasource.DataSourceUtils.doReleaseConnection(DataSourceUtils.java:323)
at org.springframework.jdbc.datasource.DataSourceUtils.releaseConnection(DataSourceUtils.java:294)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:610)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:637)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:666)
at org.springframework.security.acls.jdbc.BasicLookupStrategy.lookupObjectIdentities(BasicLookupStrategy.java:341)
Code:
finally {
if (psc instanceof ParameterDisposer) {
((ParameterDisposer) psc).cleanupParameters();
}
JdbcUtils.closeStatement(ps);
DataSourceUtils.releaseConnection(con, getDataSource());
}
If you want to debug I have a zip file that I can give you.
Thanks a lot for your time.