[ https://issues.apache.org/jira/browse/JCR-731?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12472398 ]
Martijn Hendriks commented on JCR-731: -------------------------------------- Stefan, thanks for your feedback! I agree that using the exception mechanism for checking the existence of item states should be avoided. I noticed, however, that the commen code pattern "if (node.hasNode("a")) Node aNode = node.getNode("a"); " uses 4 calls to the database if the node "a" exists, but is not yet in the cache. The pre-loading in hasNonVirtualItemState reduces this to only 1 call. The usage of an exception can quite easily be avoided, I think, by letting the persistence manager not throw an "NoSuchItemStateException" if a state doesn't exist, but instead just return null. With pre-loading there is of course the drawback that a huge state is loaded, but not requested by the repository user. I have the feeling that this is uncommon. The patch indeed is non-trivial and needs carefull reviewing. I unfortunately did not take the Jackrabbit code style into account... I'm happy to provide a fixed patch that solves this if needed. As for the benchmark you mention, I will attach a test class that spawns a number of threads that randomly read from a repository. Especially the impact of the pre-loading is significant: the test runs approximately 1.7 times as fast. Additional use of the MLRU and CacheManager patch improves this a bit to 1.8. Best wishes, Martijn > Can the caching mechanism be improved? > -------------------------------------- > > Key: JCR-731 > URL: https://issues.apache.org/jira/browse/JCR-731 > Project: Jackrabbit > Issue Type: Improvement > Components: core > Reporter: Martijn Hendriks > Attachments: CacheManager.java, JCR-731.diff, > MLRUItemStateCache.java, SharedItemStateManager.java > > > Hi all, > We've identified the method "getNonVirtualItemState" in the > SharedItemStateManager as a hot spot in our application. To avoid the > contention in "getNonVirtualItemState", we have pulled the isCached call out > of the synchronized block and re-implemented the MLRUItemStateCache. It uses > a HashMap that contains the ItemId-ItemState mapping and a ReadWriteLock to > replace all synchronized blocks in the code. The implementation of > "shrinkIfRequired" unfortunatly got much more expensive as the entryset of > the HashMap must be sorted by accesscount. This method then clearly is a > bottleneck. We solved this by changing the CacheManager a bit: the > "resizeAll" method avoids the eviction of items out of caches as long as > possible. > These changes work out really well for our application. I have attached the > changed files; comments/feedback are very welcome! > Regards, > Martijn Hendriks > <GX> creative online development B.V. > > t: 024 - 3888 261 > f: 024 - 3888 621 > e: [EMAIL PROTECTED] > > Wijchenseweg 111 > 6538 SW Nijmegen > http://www.gx.nl/ -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.