Quantcast
Channel: Spring Community Forums - Data
Viewing all articles
Browse latest Browse all 297

JDBCTemplate premature close connection

$
0
0
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

Code:

com.mchange.v2.c3p0.debug.AfterCloseLoggingComboPooledDataSource
and the stack trace that I get is:

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)

From here:

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)

and here(JDBCTemplate line 610):

Code:

                finally {
                        if (psc instanceof ParameterDisposer) {
                                ((ParameterDisposer) psc).cleanupParameters();
                        }
                        JdbcUtils.closeStatement(ps);
                        DataSourceUtils.releaseConnection(con, getDataSource());
                }

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.

Viewing all articles
Browse latest Browse all 297

Trending Articles