Paul Bjorkstrand created SLING-12279:
----------------------------------------

             Summary: Move Sling Model cache holder for Resource and 
ResourceResolver adaptables into the resource resolver property map
                 Key: SLING-12279
                 URL: https://issues.apache.org/jira/browse/SLING-12279
             Project: Sling
          Issue Type: Improvement
          Components: Sling Models
    Affects Versions: Models Implementation 1.6.4
            Reporter: Paul Bjorkstrand


There have been several instances of issues with model caching over the years, 
the most recent being SLING-12259 and [this 
thread|https://www.mail-archive.com/[email protected]/msg131926.html] from   
     Jörg Hoh. These recent issues have been around cached items sticking 
around for too long. In that thread, it was discussed using 
{{[ResourceResolver#getPropertyMap()|https://github.com/apache/sling-org-apache-sling-api/blob/master/src/main/java/org/apache/sling/api/resource/ResourceResolver.java#L888]}}
 whenever possible. This binds the cache to the lifecycle of the 
ResourceResolver, avoiding the global cache altogether.

After looking at the [current 
implementation|https://github.com/apache/sling-org-apache-sling-models-impl/blob/master/src/main/java/org/apache/sling/models/impl/ModelAdapterFactory.java#L341],
 there is already a divergence that binds the cache for request-based models to 
the request, by putting the cache in the request attribute.

This proposes to do a similar change for Resource/Resolver based models, and 
use the resolver's property map to bind the cache for those adaptables to the 
lifecycle of the ResourceResolver. Resources are already (largely) bound to the 
lifecycle of the ResourceResolver that supplied them, and binding the models 
that come from these Resources seems to be a reasonable approach.

This will greatly reduce the lifetime of model objects, reducing the likelihood 
of the JVM's GC being put under pressure in cases when cached models [reference 
the original adaptable using 
{{@Self}}|https://sling.apache.org/documentation/bundles/models.html#a-note-about-cache-true-and-using-the-self-injector].
 As a bonus, if the cache object implements {{Closeable}}, the Sling 
Implementation will call {{close()}} on the cache when the resolver is closed,, 
giving us further control over the lifetime of objects in the cache.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to