From b19c40939f7344337a61592b02a398be1b4e3c05 Mon Sep 17 00:00:00 2001 From: Britt Park Date: Sat, 2 Dec 2006 20:53:33 +0000 Subject: [PATCH] Added a primitive but seemingly effective store name cache. Switching the stores table to a synthetic primary key caused a 15% performance drop. This gets that performance back, plus or minus. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@4493 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../org/alfresco/repo/avm/AVMRepository.java | 2 ++ .../org/alfresco/repo/avm/AVMStoreDAO.java | 5 +++ .../avm/hibernate/AVMStoreDAOHibernate.java | 35 ++++++++++++++++++- 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/source/java/org/alfresco/repo/avm/AVMRepository.java b/source/java/org/alfresco/repo/avm/AVMRepository.java index 6e2324caa7..cb577bebcf 100644 --- a/source/java/org/alfresco/repo/avm/AVMRepository.java +++ b/source/java/org/alfresco/repo/avm/AVMRepository.java @@ -754,6 +754,7 @@ public class AVMRepository } AVMDAOs.Instance().fAVMStorePropertyDAO.delete(store); AVMDAOs.Instance().fAVMStoreDAO.delete(store); + AVMDAOs.Instance().fAVMStoreDAO.invalidateCache(); } /** @@ -2261,5 +2262,6 @@ public class AVMRepository } store.setName(destName); fLookupCache.onDelete(sourceName); + AVMDAOs.Instance().fAVMStoreDAO.invalidateCache(); } } diff --git a/source/java/org/alfresco/repo/avm/AVMStoreDAO.java b/source/java/org/alfresco/repo/avm/AVMStoreDAO.java index db0d106909..e44b213cca 100644 --- a/source/java/org/alfresco/repo/avm/AVMStoreDAO.java +++ b/source/java/org/alfresco/repo/avm/AVMStoreDAO.java @@ -69,4 +69,9 @@ public interface AVMStoreDAO * @return The store. */ public AVMStore getByID(long id); + + /** + * Invalidate the by name lookup cache. + */ + public void invalidateCache(); } diff --git a/source/java/org/alfresco/repo/avm/hibernate/AVMStoreDAOHibernate.java b/source/java/org/alfresco/repo/avm/hibernate/AVMStoreDAOHibernate.java index 01f0246761..c207f1e5c8 100644 --- a/source/java/org/alfresco/repo/avm/hibernate/AVMStoreDAOHibernate.java +++ b/source/java/org/alfresco/repo/avm/hibernate/AVMStoreDAOHibernate.java @@ -17,7 +17,9 @@ package org.alfresco.repo.avm.hibernate; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.alfresco.repo.avm.AVMNode; import org.alfresco.repo.avm.AVMStore; @@ -33,12 +35,18 @@ import org.springframework.orm.hibernate3.support.HibernateDaoSupport; class AVMStoreDAOHibernate extends HibernateDaoSupport implements AVMStoreDAO { + /** + * An in memory cache of name to primary key mappings. + */ + private Map fNameCache; + /** * Do nothing constructor. */ public AVMStoreDAOHibernate() { super(); + fNameCache = new HashMap(); } /** @@ -77,10 +85,27 @@ class AVMStoreDAOHibernate extends HibernateDaoSupport implements */ public AVMStore getByName(String name) { + Long id = null; + synchronized (this) + { + id = fNameCache.get(name); + } + if (id != null) + { + return (AVMStore)getSession().get(AVMStoreImpl.class, id); + } Query query = getSession().createQuery("from AVMStoreImpl st " + "where st.name = :name"); query.setParameter("name", name); - return (AVMStore)query.uniqueResult(); + AVMStore result = (AVMStore)query.uniqueResult(); + synchronized (this) + { + if (result != null) + { + fNameCache.put(name, result.getId()); + } + } + return result; } /** @@ -112,4 +137,12 @@ class AVMStoreDAOHibernate extends HibernateDaoSupport implements { return (AVMStore)getSession().get(AVMStoreImpl.class, id); } + + /* (non-Javadoc) + * @see org.alfresco.repo.avm.AVMStoreDAO#invalidateCache() + */ + public synchronized void invalidateCache() + { + fNameCache.clear(); + } }