[
https://issues.apache.org/jira/browse/CAY-2913?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18060050#comment-18060050
]
Andrus Adamchik commented on CAY-2913:
--------------------------------------
I just pushed what I think is a pretty accurate unit test for this condition -
{color:#000000}DataNodeQueryExceptionsIT{color}. Can't reproduce it. Even when
the throwable is an Error (instead of an Exception), the connection is closed
properly.
> Suspected connection leak on SQLTemplateProcessor exceptions
> ------------------------------------------------------------
>
> Key: CAY-2913
> URL: https://issues.apache.org/jira/browse/CAY-2913
> Project: Cayenne
> Issue Type: Bug
> Affects Versions: 4.2.3
> Reporter: Andrus Adamchik
> Assignee: Andrus Adamchik
> Priority: Major
>
> We are using VelocitySQLTemplateProcessor in some of the apps, running
> LinkMove jobs. Due to Velocity version mismatch in the app we were getting
> exceptions like the one below.
> That mismatch is NOT the issue here and is totally developer's fault, but its
> consequences seem to point to a resource leak in Cayenne (with a slight
> possibility that the issue is in LinkMove?). Each such exception would result
> in the JDBC connection not returned to the pool. So eventually the pool would
> run out of connections, resulting in app-wide failures.
> Again, the exception below is not the problem by itself, but seems like it
> results in a connection leak:
> {noformat}
> java.lang.NoClassDefFoundError:
> org/apache/velocity/runtime/parser/node/StandardParserDefaultVisitor
> at java.base/java.lang.ClassLoader.defineClass1(Native Method)
> at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1027)
> at
> java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)
> at
> java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:862)
> at
> java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:760)
> at
> java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681)
> at
> java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639)
> at
> java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
> at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
> at
> org.apache.cayenne.velocity.VelocitySQLTemplateProcessor.processTemplate(VelocitySQLTemplateProcessor.java:142)
> at
> org.apache.cayenne.access.jdbc.SQLTemplateAction.runWithPositionalParameters(SQLTemplateAction.java:141)
> at
> org.apache.cayenne.access.jdbc.SQLTemplateAction.performAction(SQLTemplateAction.java:113)
> at
> org.apache.cayenne.access.DataNodeQueryAction.runQuery(DataNodeQueryAction.java:97)
> at org.apache.cayenne.access.DataNode.performQueries(DataNode.java:273)
> at
> org.apache.cayenne.access.DataDomainQueryAction.runQuery(DataDomainQueryAction.java:471)
> at
> org.apache.cayenne.access.DataDomainQueryAction.lambda$runQueryInTransaction$1(DataDomainQueryAction.java:447)
> at
> org.apache.cayenne.tx.DefaultTransactionManager$BaseTransactionHandler.performInTransaction(DefaultTransactionManager.java:180)
> at
> org.apache.cayenne.tx.DefaultTransactionManager$BaseTransactionHandler.performInNewTransaction(DefaultTransactionManager.java:152)
> at
> org.apache.cayenne.tx.DefaultTransactionManager$NestedTransactionHandler.handle(DefaultTransactionManager.java:95)
> at
> org.apache.cayenne.tx.DefaultTransactionManager.performInTransaction(DefaultTransactionManager.java:62)
> at
> org.apache.cayenne.tx.DefaultTransactionManager.performInTransaction(DefaultTransactionManager.java:40)
> at
> org.apache.cayenne.access.DataDomainQueryAction.runQueryInTransaction(DataDomainQueryAction.java:446)
> at
> org.apache.cayenne.access.DataDomainQueryAction.execute(DataDomainQueryAction.java:129)
> at org.apache.cayenne.access.DataDomain.onQueryNoFilters(DataDomain.java:570)
> at
> org.apache.cayenne.access.DataDomain$DataDomainQueryFilterChain.onQuery(DataDomain.java:819)
> at org.apache.cayenne.access.DataDomain.onQuery(DataDomain.java:562)
> at
> org.apache.cayenne.util.ObjectContextQueryAction.runQuery(ObjectContextQueryAction.java:406)
> at
> org.apache.cayenne.util.ObjectContextQueryAction.executePostCache(ObjectContextQueryAction.java:107)
> at
> org.apache.cayenne.util.ObjectContextQueryAction.execute(ObjectContextQueryAction.java:94)
> at org.apache.cayenne.access.DataContext.onQuery(DataContext.java:960)
> at org.apache.cayenne.access.DataContext.performQuery(DataContext.java:949)
> at org.apache.cayenne.BaseContext.select(BaseContext.java:307)
> at org.apache.cayenne.BaseContext.selectOne(BaseContext.java:315)
> at org.apache.cayenne.query.SQLSelect.selectOne(SQLSelect.java:283)
> Caused by: java.lang.ClassNotFoundException:
> org.apache.velocity.runtime.parser.node.StandardParserDefaultVisitorat
> java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
> at
> java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
> at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
> ... 52 common frames omitted {noformat}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)