[ 
https://issues.apache.org/jira/browse/ISIS-1134?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14500668#comment-14500668
 ] 

Martin Grigorov commented on ISIS-1134:
---------------------------------------

org.apache.isis.core.metamodel.services.container.DomainObjectContainerDefault#firstMatch(org.apache.isis.applib.query.Query<T>)
 starts with flush() call.
Why this is needed? Why by default?
It looks like a custom transaction isolation mechanism.

Removing this #flush() call fixes the issue above and my app seems to work 
fine. But I'm sure some applications' use cases must be broken now.

> DN connections leak due to non-closed queries (?!)
> --------------------------------------------------
>
>                 Key: ISIS-1134
>                 URL: https://issues.apache.org/jira/browse/ISIS-1134
>             Project: Isis
>          Issue Type: Bug
>          Components: Core
>    Affects Versions: core-1.8.0
>            Reporter: Martin Grigorov
>            Assignee: Dan Haywood
>
> My application failed twice with OutOfMemoryError in heap space so I've 
> dumped a .hprof of its memory (jmap -dump:format=b,file=some-file.hprof) and 
> analyzed it with Eclipse MAT (https://eclipse.org/mat/).
> It appears that there are many org.datanucleus.store.rdbms.query.JDOQLQuery$2 
> objects.
> JDOQLQuery$2 appears to be ManagedConnectionResourceListener ( 
> https://github.com/datanucleus/datanucleus-rdbms/blob/651c77ff3b2af76ada97d14b537cd41fb0524a0c/src/java/org/datanucleus/store/rdbms/query/JDOQLQuery.java#L740).
> The listener is removed only when 
> org.datanucleus.store.query.AbstractQueryResult#close() method is called.
> org.apache.isis.objectstore.jdo.datanucleus.persistence.queries.PersistenceQueryFindAllInstancesProcessor#process()
>  does:
> {code}
> final List<?> pojos = (List<?>) jdoQuery.execute();
> return loadAdapters(specification, pojos);
> {code}
> So it consumes the result and returns ObjectAdapter for each pojo but it 
> doesn't close the Query.
> AFAIK open-session-in-view pattern is not used in Isis so the resources 
> should be closed explicitly after usage.
> A simple solution is to try/finally this code and close the query but I may 
> miss some detail here.
> Related: recently I've profiled the application with Yourkit and it showed 
> that DomainObjectContainer#allMatches() method is slow in one of the use 
> cases. Some quick investigation showed that DomainObjectContainer delegates 
> the work to 
> org.apache.isis.objectstore.jdo.datanucleus.persistence.queries.PersistenceQueryProcessor#process().
>  It loads the POJOs from the DB, then wraps them in ObjectAdapters, and 
> finally 
> org.apache.isis.core.metamodel.services.container.DomainObjectContainerDefault#allMatches(org.apache.isis.applib.query.Query<T>)
>  unwraps them back to POJOs.
> Why this is done?
> This solves the issue of "consume the QueryResult before closing it" for the 
> memory leak issue but it also adds to the processing time.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to