Merged V2.1 to HEAD

6944: More hibernate session cache taming.
   6945: Times for commits are close to linear in the number of items submitted.
   6946: Missing break statement. (Courtesy of Jan).
   6948: Fixed session cache eviction problem triggered by resetLayer().
   6956: Wrapped AVMService and AttributeService in TransactionResourceInterceptor.
   Reverted log4j.properties


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@7368 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Derek Hulley
2007-11-12 23:18:09 +00:00
parent e3d5cececb
commit 209dd85a0d
23 changed files with 416 additions and 306 deletions

View File

@@ -4,7 +4,22 @@
<beans> <beans>
<bean id="attributeService" class="org.alfresco.repo.attributes.AttributeServiceImpl"> <bean id="attributeService" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>org.alfresco.service.cmr.attributes.AttributeService</value>
</property>
<property name="target">
<ref bean="attributeServiceBase"/>
</property>
<property name="interceptorNames">
<list>
<value>sessionSizeResourceInterceptor</value>
</list>
</property>
</bean>
<bean id="attributeServiceBase" class="org.alfresco.repo.attributes.AttributeServiceImpl">
<property name="attributeConverter"> <property name="attributeConverter">
<ref bean="attributeConverter"/> <ref bean="attributeConverter"/>
</property> </property>

View File

@@ -97,6 +97,12 @@
</property> </property>
</bean> </bean>
<bean id="sessionCacheChecker" class="org.alfresco.repo.avm.hibernate.SessionCacheChecker">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<bean id="avmDAOs" class="org.alfresco.repo.avm.AVMDAOs"> <bean id="avmDAOs" class="org.alfresco.repo.avm.AVMDAOs">
<property name="issuerDAO"> <property name="issuerDAO">
<ref bean="issuerDAO"/> <ref bean="issuerDAO"/>

View File

@@ -185,7 +185,8 @@
<value>10000</value> <value>10000</value>
</property> </property>
<property name="resourceManagerCallFrequencyMillis"> <property name="resourceManagerCallFrequencyMillis">
<value>5000</value> <!-- Was 5000 -->
<value>1000</value>
</property> </property>
</bean> </bean>
<bean id="sessionSizeResourceManager" class="org.alfresco.repo.domain.hibernate.SessionSizeResourceManager"> <bean id="sessionSizeResourceManager" class="org.alfresco.repo.domain.hibernate.SessionSizeResourceManager">
@@ -193,7 +194,8 @@
<ref bean="sessionFactory" /> <ref bean="sessionFactory" />
</property> </property>
<property name="threshold"> <property name="threshold">
<value>5000</value> <!-- Was 5000 -->
<value>100</value>
</property> </property>
</bean> </bean>

View File

@@ -791,7 +791,21 @@
<!-- The AVMService --> <!-- The AVMService -->
<bean id="avmService" class="org.alfresco.repo.avm.AVMServiceImpl"> <bean id="avmService" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>org.alfresco.service.cmr.avm.AVMService</value>
</property>
<property name="target">
<ref bean="avmServiceBase"/>
</property>
<property name="interceptorNames">
<list>
<value>sessionSizeResourceInterceptor</value>
</list>
</property>
</bean>
<bean id="avmServiceBase" class="org.alfresco.repo.avm.AVMServiceImpl">
<property name="avmRepository"> <property name="avmRepository">
<ref bean="avmRepository"/> <ref bean="avmRepository"/>
</property> </property>

View File

@@ -25,7 +25,10 @@
package org.alfresco.repo.attributes; package org.alfresco.repo.attributes;
import java.util.Map;
import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.repo.avm.AVMDAOs;
/** /**
* Handles conversions between persistent and value based Attributes. * Handles conversions between persistent and value based Attributes.
@@ -96,56 +99,78 @@ public class AttributeConverter
public Attribute toValue(Attribute from) public Attribute toValue(Attribute from)
{ {
Attribute ret = null;
switch (from.getType()) switch (from.getType())
{ {
case BOOLEAN : case BOOLEAN :
{ {
return new BooleanAttributeValue((BooleanAttribute)from); ret = new BooleanAttributeValue((BooleanAttribute)from);
break;
} }
case BYTE : case BYTE :
{ {
return new ByteAttributeValue((ByteAttribute)from); ret = new ByteAttributeValue((ByteAttribute)from);
break;
} }
case SHORT : case SHORT :
{ {
return new ShortAttributeValue((ShortAttribute)from); ret = new ShortAttributeValue((ShortAttribute)from);
break;
} }
case INT : case INT :
{ {
return new IntAttributeValue((IntAttribute)from); ret = new IntAttributeValue((IntAttribute)from);
break;
} }
case LONG : case LONG :
{ {
return new LongAttributeValue((LongAttribute)from); ret = new LongAttributeValue((LongAttribute)from);
break;
} }
case FLOAT : case FLOAT :
{ {
return new FloatAttributeValue((FloatAttribute)from); ret = new FloatAttributeValue((FloatAttribute)from);
break;
} }
case DOUBLE : case DOUBLE :
{ {
return new DoubleAttributeValue((DoubleAttribute)from); ret = new DoubleAttributeValue((DoubleAttribute)from);
break;
} }
case STRING : case STRING :
{ {
return new StringAttributeValue((StringAttribute)from); ret = new StringAttributeValue((StringAttribute)from);
break;
} }
case SERIALIZABLE : case SERIALIZABLE :
{ {
return new SerializableAttributeValue((SerializableAttribute)from); ret = new SerializableAttributeValue((SerializableAttribute)from);
break;
} }
case MAP : case MAP :
{ {
return new MapAttributeValue((MapAttribute)from); ret = new MapAttributeValue();
for (Map.Entry<String, Attribute> entry : from.entrySet())
{
ret.put(entry.getKey(), toValue(entry.getValue()));
}
break;
} }
case LIST : case LIST :
{ {
return new ListAttributeValue((ListAttribute)from); ret = new ListAttributeValue();
for (Attribute child : from)
{
ret.add(toValue(child));
}
break;
} }
default : default :
{ {
throw new AlfrescoRuntimeException("Invalid Attribute Type: " + from.getType()); throw new AlfrescoRuntimeException("Invalid Attribute Type: " + from.getType());
} }
} }
AVMDAOs.Instance().fAttributeDAO.evictFlat(from);
return ret;
} }
} }

View File

@@ -68,4 +68,15 @@ public interface AttributeDAO
* @param attr * @param attr
*/ */
public void evict(Attribute attr); public void evict(Attribute attr);
/**
* Evict an Attribute non-recursively.
* @param attr
*/
public void evictFlat(Attribute attr);
/**
* Force a flush.
*/
public void flush();
} }

View File

@@ -193,7 +193,6 @@ public class AttributeServiceImpl implements AttributeService
return null; return null;
} }
Attribute converted = fAttributeConverter.toValue(found); Attribute converted = fAttributeConverter.toValue(found);
fAttributeDAO.evict(found);
return converted; return converted;
} }
@@ -255,7 +254,6 @@ public class AttributeServiceImpl implements AttributeService
} }
Attribute converted = fAttributeConverter.toPersistent(value); Attribute converted = fAttributeConverter.toPersistent(value);
found.put(name, converted); found.put(name, converted);
fAttributeDAO.evict(converted);
} }
/* (non-Javadoc) /* (non-Javadoc)
@@ -316,6 +314,8 @@ public class AttributeServiceImpl implements AttributeService
throw new AVMWrongTypeException("Attribute Not Map: " + keys); throw new AVMWrongTypeException("Attribute Not Map: " + keys);
} }
found.remove(name); found.remove(name);
fAttributeDAO.flush();
fAttributeDAO.evictFlat(found);
} }
private Attribute getAttributeFromPath(List<String> keys) private Attribute getAttributeFromPath(List<String> keys)
@@ -330,11 +330,15 @@ public class AttributeServiceImpl implements AttributeService
{ {
if (current.getType() == Type.MAP) if (current.getType() == Type.MAP)
{ {
current = current.get(keys.get(i)); Attribute newCurrent = current.get(keys.get(i));
fAttributeDAO.evictFlat(current);
current = newCurrent;
} }
else if (current.getType() == Type.LIST) else if (current.getType() == Type.LIST)
{ {
current = current.get(Integer.parseInt(keys.get(i))); Attribute newCurrent = current.get(Integer.parseInt(keys.get(i)));
fAttributeDAO.evictFlat(current);
current = newCurrent;
} }
else else
{ {
@@ -486,7 +490,6 @@ public class AttributeServiceImpl implements AttributeService
} }
Attribute converted = fAttributeConverter.toPersistent(value); Attribute converted = fAttributeConverter.toPersistent(value);
found.set(index, fAttributeConverter.toPersistent(value)); found.set(index, fAttributeConverter.toPersistent(value));
fAttributeDAO.evict(converted);
} }
/* (non-Javadoc) /* (non-Javadoc)
@@ -515,7 +518,13 @@ public class AttributeServiceImpl implements AttributeService
{ {
throw new AVMBadArgumentException("Illegal zero length keys list."); throw new AVMBadArgumentException("Illegal zero length keys list.");
} }
return getAttributeFromPath(keys) != null; Attribute attr = getAttributeFromPath(keys);
if (attr != null)
{
fAttributeDAO.evictFlat(attr);
return true;
}
return false;
} }
/* (non-Javadoc) /* (non-Javadoc)

View File

@@ -170,7 +170,8 @@ public class MapAttributeImpl extends AttributeImpl implements MapAttribute
{ {
return null; return null;
} }
return entry.getAttribute(); Attribute attr = entry.getAttribute();
return attr;
} }
/* (non-Javadoc) /* (non-Javadoc)

View File

@@ -46,4 +46,10 @@ public interface MapEntryDAO
* @return The number of entries. * @return The number of entries.
*/ */
public int size(MapAttribute mapAttr); public int size(MapAttribute mapAttr);
/**
* Evict an entry.
* @param entry
*/
public void evict(MapEntry entry);
} }

View File

@@ -27,8 +27,10 @@ package org.alfresco.repo.attributes.hibernate;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
import org.alfresco.repo.attributes.AttrQueryHelperImpl; import org.alfresco.repo.attributes.AttrQueryHelperImpl;
import org.alfresco.repo.attributes.Attribute; import org.alfresco.repo.attributes.Attribute;
@@ -40,12 +42,14 @@ import org.alfresco.repo.attributes.MapAttribute;
import org.alfresco.repo.attributes.MapEntry; import org.alfresco.repo.attributes.MapEntry;
import org.alfresco.repo.attributes.MapEntryDAO; import org.alfresco.repo.attributes.MapEntryDAO;
import org.alfresco.repo.attributes.Attribute.Type; import org.alfresco.repo.attributes.Attribute.Type;
import org.alfresco.repo.avm.hibernate.SessionCacheChecker;
import org.alfresco.service.cmr.attributes.AttrQuery; import org.alfresco.service.cmr.attributes.AttrQuery;
import org.alfresco.service.cmr.attributes.AttrQueryHelper; import org.alfresco.service.cmr.attributes.AttrQueryHelper;
import org.alfresco.util.Pair; import org.alfresco.util.Pair;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.hibernate.Query; import org.hibernate.Query;
import org.hibernate.engine.EntityKey;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
/** /**
@@ -87,7 +91,6 @@ public class AttributeDAOHibernate extends HibernateDaoSupport implements
for (MapEntry entry : mapEntries) for (MapEntry entry : mapEntries)
{ {
Attribute subAttr = entry.getAttribute(); Attribute subAttr = entry.getAttribute();
getSession().evict(entry);
fMapEntryDAO.delete(entry); fMapEntryDAO.delete(entry);
delete(subAttr); delete(subAttr);
} }
@@ -99,7 +102,6 @@ public class AttributeDAOHibernate extends HibernateDaoSupport implements
for (ListEntry entry : listEntries) for (ListEntry entry : listEntries)
{ {
Attribute subAttr = entry.getAttribute(); Attribute subAttr = entry.getAttribute();
getSession().evict(entry);
fListEntryDAO.delete(entry); fListEntryDAO.delete(entry);
delete(subAttr); delete(subAttr);
} }
@@ -108,7 +110,6 @@ public class AttributeDAOHibernate extends HibernateDaoSupport implements
{ {
fgLogger.debug("Entities: " + getSession().getStatistics().getEntityCount()); fgLogger.debug("Entities: " + getSession().getStatistics().getEntityCount());
} }
getSession().evict(attr);
getSession().delete(attr); getSession().delete(attr);
} }
@@ -161,20 +162,20 @@ public class AttributeDAOHibernate extends HibernateDaoSupport implements
*/ */
public void evict(Attribute attr) public void evict(Attribute attr)
{ {
if (attr.getType() == Attribute.Type.MAP) }
{
for (Attribute child : attr.values()) /* (non-Javadoc)
{ * @see org.alfresco.repo.attributes.AttributeDAO#flush()
evict(child); */
} public void flush()
} {
if (attr.getType() == Attribute.Type.LIST) getSession().flush();
{ }
for (Attribute child : attr)
{ /* (non-Javadoc)
evict(child); * @see org.alfresco.repo.attributes.AttributeDAO#evictFlat(org.alfresco.repo.attributes.Attribute)
} */
} public void evictFlat(Attribute attr)
getSession().evict(attr); {
} }
} }

View File

@@ -96,4 +96,11 @@ public class MapEntryDAOHibernate extends HibernateDaoSupport implements
query.setEntity("map", mapAttr); query.setEntity("map", mapAttr);
return ((Long)query.uniqueResult()).intValue(); return ((Long)query.uniqueResult()).intValue();
} }
/* (non-Javadoc)
* @see org.alfresco.repo.attributes.MapEntryDAO#evict(org.alfresco.repo.attributes.MapEntry)
*/
public void evict(MapEntry entry)
{
}
} }

View File

@@ -340,8 +340,6 @@ public class AVMRepository
dir.putChild(name, child); dir.putChild(name, child);
fLookupCache.onWrite(pathParts[0]); fLookupCache.onWrite(pathParts[0]);
AVMNodeDescriptor desc = child.getDescriptor(parent.getPath(), name, parent.getIndirection(), parent.getIndirectionVersion()); AVMNodeDescriptor desc = child.getDescriptor(parent.getPath(), name, parent.getIndirection(), parent.getIndirectionVersion());
fAVMNodeDAO.flush();
fAVMNodeDAO.evict(child);
return desc; return desc;
} }
@@ -1046,7 +1044,8 @@ public class AVMRepository
throw new AVMWrongTypeException("Not a directory."); throw new AVMWrongTypeException("Not a directory.");
} }
DirectoryNode dirNode = (DirectoryNode)node; DirectoryNode dirNode = (DirectoryNode)node;
return dirNode.getListing(dir, includeDeleted); SortedMap<String, AVMNodeDescriptor> listing = dirNode.getListing(dir, includeDeleted);
return listing;
} }
finally finally
{ {
@@ -2483,8 +2482,6 @@ public class AVMRepository
} }
LayeredDirectoryNode dir = (LayeredDirectoryNode)node; LayeredDirectoryNode dir = (LayeredDirectoryNode)node;
dir.flatten(name); dir.flatten(name);
fAVMNodeDAO.flush();
fAVMNodeDAO.evict(dir);
} }
finally finally
{ {
@@ -2516,8 +2513,6 @@ public class AVMRepository
} }
AVMNode node = lPath.getCurrentNode(); AVMNode node = lPath.getCurrentNode();
AVMNodeDescriptor desc = node.getDescriptor(lPath); AVMNodeDescriptor desc = node.getDescriptor(lPath);
fAVMNodeDAO.flush();
fAVMNodeDAO.evict(node);
return desc; return desc;
} }
finally finally
@@ -2738,7 +2733,6 @@ public class AVMRepository
throw new AVMNotFoundException("Node not found: " + desc); throw new AVMNotFoundException("Node not found: " + desc);
} }
Set<QName> aspects = node.getAspects(); Set<QName> aspects = node.getAspects();
fAVMNodeDAO.evict(node);
return aspects; return aspects;
} }
} }

View File

@@ -361,8 +361,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
{ {
newDir.getProperties().putAll(properties); newDir.getProperties().putAll(properties);
} }
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(newDir);
} }
/** /**
@@ -407,8 +405,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
} }
dir.updateModTime(); dir.updateModTime();
dir.putChild(name, newDir); dir.putChild(name, newDir);
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(newDir);
// newDir.setVersionID(getNextVersionID()); // newDir.setVersionID(getNextVersionID());
} }
@@ -445,8 +441,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
-1, -1,
"UTF-8")); "UTF-8"));
ContentWriter writer = createContentWriter(AVMNodeConverter.ExtendAVMPath(path, name)); ContentWriter writer = createContentWriter(AVMNodeConverter.ExtendAVMPath(path, name));
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(file);
return writer.getContentOutputStream(); return writer.getContentOutputStream();
} }
@@ -490,10 +484,9 @@ public class AVMStoreImpl implements AVMStore, Serializable
{ {
file.getProperties().putAll(properties); file.getProperties().putAll(properties);
} }
ContentWriter writer = createContentWriter(AVMNodeConverter.ExtendAVMPath(path, name));
// Yet another flush. // Yet another flush.
AVMDAOs.Instance().fAVMNodeDAO.flush(); AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(file); ContentWriter writer = createContentWriter(AVMNodeConverter.ExtendAVMPath(path, name));
writer.putContent(data); writer.putContent(data);
} }
@@ -526,8 +519,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
} }
dir.updateModTime(); dir.updateModTime();
dir.putChild(name, newFile); dir.putChild(name, newFile);
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(newFile);
// newFile.setVersionID(getNextVersionID()); // newFile.setVersionID(getNextVersionID());
} }
@@ -633,7 +624,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
AVMNode child = AVMNodeUnwrapper.Unwrap(listing.get(name)); AVMNode child = AVMNodeUnwrapper.Unwrap(listing.get(name));
AVMNodeDescriptor desc = child.getDescriptor(lPath, name); AVMNodeDescriptor desc = child.getDescriptor(lPath, name);
results.put(name, desc); results.put(name, desc);
AVMDAOs.Instance().fAVMNodeDAO.evict(child);
} }
return results; return results;
} }
@@ -653,8 +643,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
} }
DirectoryNode dir = (DirectoryNode)lPath.getCurrentNode(); DirectoryNode dir = (DirectoryNode)lPath.getCurrentNode();
List<String> deleted = dir.getDeletedNames(); List<String> deleted = dir.getDeletedNames();
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(dir);
return deleted; return deleted;
} }
@@ -688,8 +676,8 @@ public class AVMStoreImpl implements AVMStore, Serializable
} }
dir.removeChild(lPath, name); dir.removeChild(lPath, name);
dir.updateModTime(); dir.updateModTime();
AVMDAOs.Instance().fAVMNodeDAO.flush(); // AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(dir); // AVMDAOs.Instance().fAVMNodeDAO.evict(dir);
} }
/** /**
@@ -711,8 +699,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
} }
((LayeredDirectoryNode)node).uncover(lPath, name); ((LayeredDirectoryNode)node).uncover(lPath, name);
node.updateModTime(); node.updateModTime();
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(node);
} }
// TODO This is problematic. As time goes on this returns // TODO This is problematic. As time goes on this returns
@@ -882,8 +868,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
} }
dir.turnPrimary(lPath); dir.turnPrimary(lPath);
dir.updateModTime(); dir.updateModTime();
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(dir);
} }
/** /**
@@ -905,8 +889,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
} }
dir.retarget(lPath, target); dir.retarget(lPath, target);
dir.updateModTime(); dir.updateModTime();
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(dir);
} }
/** /**
@@ -1080,8 +1062,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
} }
((LayeredDirectoryNode)node).setOpacity(opacity); ((LayeredDirectoryNode)node).setOpacity(opacity);
node.updateModTime(); node.updateModTime();
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(node);
} }
// TODO Does it make sense to set properties on DeletedNodes? // TODO Does it make sense to set properties on DeletedNodes?
@@ -1101,8 +1081,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
AVMNode node = lPath.getCurrentNode(); AVMNode node = lPath.getCurrentNode();
node.setProperty(name, value); node.setProperty(name, value);
node.setGuid(GUID.generate()); node.setGuid(GUID.generate());
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(node);
} }
/** /**
@@ -1120,8 +1098,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
AVMNode node = lPath.getCurrentNode(); AVMNode node = lPath.getCurrentNode();
node.addProperties(properties); node.addProperties(properties);
node.setGuid(GUID.generate()); node.setGuid(GUID.generate());
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(node);
} }
/** /**
@@ -1140,8 +1116,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
} }
AVMNode node = lPath.getCurrentNode(); AVMNode node = lPath.getCurrentNode();
PropertyValue prop = node.getProperty(name); PropertyValue prop = node.getProperty(name);
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(node);
return prop; return prop;
} }
@@ -1160,8 +1134,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
} }
AVMNode node = lPath.getCurrentNode(); AVMNode node = lPath.getCurrentNode();
Map<QName, PropertyValue> props = node.getProperties(); Map<QName, PropertyValue> props = node.getProperties();
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(node);
return props; return props;
} }
@@ -1180,8 +1152,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
AVMNode node = lPath.getCurrentNode(); AVMNode node = lPath.getCurrentNode();
node.setGuid(GUID.generate()); node.setGuid(GUID.generate());
node.deleteProperty(name); node.deleteProperty(name);
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(node);
} }
/** /**
@@ -1198,8 +1168,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
AVMNode node = lPath.getCurrentNode(); AVMNode node = lPath.getCurrentNode();
node.setGuid(GUID.generate()); node.setGuid(GUID.generate());
node.deleteProperties(); node.deleteProperties();
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(node);
} }
/** /**
@@ -1287,8 +1255,8 @@ public class AVMStoreImpl implements AVMStore, Serializable
throw new AVMWrongTypeException("File Expected."); throw new AVMWrongTypeException("File Expected.");
} }
ContentData content = ((FileNode)node).getContentData(lPath); ContentData content = ((FileNode)node).getContentData(lPath);
AVMDAOs.Instance().fAVMNodeDAO.flush(); // AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(node); // AVMDAOs.Instance().fAVMNodeDAO.evict(node);
return content; return content;
} }
@@ -1312,8 +1280,8 @@ public class AVMStoreImpl implements AVMStore, Serializable
node.updateModTime(); node.updateModTime();
node.setGuid(GUID.generate()); node.setGuid(GUID.generate());
ContentData content = ((FileNode)node).getContentData(lPath); ContentData content = ((FileNode)node).getContentData(lPath);
AVMDAOs.Instance().fAVMNodeDAO.flush(); // AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(node); // AVMDAOs.Instance().fAVMNodeDAO.evict(node);
return content; return content;
} }
@@ -1335,8 +1303,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
throw new AVMWrongTypeException("File Expected."); throw new AVMWrongTypeException("File Expected.");
} }
((FileNode)node).setContentData(data); ((FileNode)node).setContentData(data);
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(node);
} }
/** /**
@@ -1354,8 +1320,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
AVMNode node = lPath.getCurrentNode(); AVMNode node = lPath.getCurrentNode();
node.copyMetaDataFrom(from); node.copyMetaDataFrom(from);
node.setGuid(GUID.generate()); node.setGuid(GUID.generate());
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(node);
} }
/** /**
@@ -1373,8 +1337,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
AVMNode node = lPath.getCurrentNode(); AVMNode node = lPath.getCurrentNode();
node.getAspects().add(aspectName); node.getAspects().add(aspectName);
node.setGuid(GUID.generate()); node.setGuid(GUID.generate());
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(node);
} }
/** /**
@@ -1392,8 +1354,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
} }
AVMNode node = lPath.getCurrentNode(); AVMNode node = lPath.getCurrentNode();
Set<QName> aspects = node.getAspects(); Set<QName> aspects = node.getAspects();
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(node);
return aspects; return aspects;
} }
@@ -1419,8 +1379,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
node.getProperties().remove(name); node.getProperties().remove(name);
} }
node.setGuid(GUID.generate()); node.setGuid(GUID.generate());
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(node);
} }
/** /**
@@ -1439,7 +1397,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
} }
AVMNode node = lPath.getCurrentNode(); AVMNode node = lPath.getCurrentNode();
boolean has = node.getAspects().contains(aspectName); boolean has = node.getAspects().contains(aspectName);
AVMDAOs.Instance().fAVMNodeDAO.evict(node);
return has; return has;
} }
@@ -1458,8 +1415,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
AVMNode node = lPath.getCurrentNode(); AVMNode node = lPath.getCurrentNode();
node.setAcl(acl); node.setAcl(acl);
node.setGuid(GUID.generate()); node.setGuid(GUID.generate());
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(node);
} }
/** /**
@@ -1532,9 +1487,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
toLink.getAspects().add(WCMModel.ASPECT_REVERTED); toLink.getAspects().add(WCMModel.ASPECT_REVERTED);
PropertyValue value = new PropertyValue(null, toRevertTo.getId()); PropertyValue value = new PropertyValue(null, toRevertTo.getId());
toLink.setProperty(WCMModel.PROP_REVERTED_ID, value); toLink.setProperty(WCMModel.PROP_REVERTED_ID, value);
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(dir);
AVMDAOs.Instance().fAVMNodeDAO.evict(toLink);
} }
/* (non-Javadoc) /* (non-Javadoc)
@@ -1549,8 +1501,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
} }
AVMNode node = lPath.getCurrentNode(); AVMNode node = lPath.getCurrentNode();
node.setGuid(guid); node.setGuid(guid);
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(node);
} }
/* (non-Javadoc) /* (non-Javadoc)
@@ -1570,8 +1520,6 @@ public class AVMStoreImpl implements AVMStore, Serializable
} }
PlainFileNode file = (PlainFileNode)node; PlainFileNode file = (PlainFileNode)node;
file.setEncoding(encoding); file.setEncoding(encoding);
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(file);
} }
/* (non-Javadoc) /* (non-Javadoc)
@@ -1591,7 +1539,5 @@ public class AVMStoreImpl implements AVMStore, Serializable
} }
PlainFileNode file = (PlainFileNode)node; PlainFileNode file = (PlainFileNode)node;
file.setMimeType(mimeType); file.setMimeType(mimeType);
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fAVMNodeDAO.evict(file);
} }
} }

View File

@@ -337,6 +337,7 @@ public class AVMSyncServiceImpl implements AVMSyncService
NameMatcher excluder, boolean ignoreConflicts, boolean ignoreOlder, NameMatcher excluder, boolean ignoreConflicts, boolean ignoreOlder,
boolean overrideConflicts, boolean overrideOlder, String tag, String description) boolean overrideConflicts, boolean overrideOlder, String tag, String description)
{ {
long start = System.currentTimeMillis();
if (fgLogger.isDebugEnabled()) if (fgLogger.isDebugEnabled())
{ {
try try
@@ -472,6 +473,10 @@ public class AVMSyncServiceImpl implements AVMSyncService
{ {
fAVMService.createSnapshot(storeName, tag, description); fAVMService.createSnapshot(storeName, tag, description);
} }
if (fgLogger.isDebugEnabled())
{
fgLogger.debug("Raw Update: " + (System.currentTimeMillis() - start));
}
} }
/** /**

View File

@@ -72,5 +72,8 @@ abstract class DirectoryNodeImpl extends AVMNodeImpl implements DirectoryNode
ChildKey key = new ChildKey(this, name); ChildKey key = new ChildKey(this, name);
ChildEntry newChild = new ChildEntryImpl(key, node); ChildEntry newChild = new ChildEntryImpl(key, node);
AVMDAOs.Instance().fChildEntryDAO.save(newChild); AVMDAOs.Instance().fChildEntryDAO.save(newChild);
AVMDAOs.Instance().fAVMNodeDAO.flush();
AVMDAOs.Instance().fChildEntryDAO.evict(newChild);
AVMDAOs.Instance().fAVMNodeDAO.evict(node);
} }
} }

View File

@@ -402,7 +402,6 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
{ {
listing.put(entry.getKey().getName(), entry.getChild()); listing.put(entry.getKey().getName(), entry.getChild());
} }
AVMDAOs.Instance().fChildEntryDAO.evict(entry);
} }
return listing; return listing;
} }
@@ -421,7 +420,6 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
{ {
listing.put(entry.getKey().getName(), entry.getChild()); listing.put(entry.getKey().getName(), entry.getChild());
} }
AVMDAOs.Instance().fChildEntryDAO.evict(entry);
} }
return listing; return listing;
} }
@@ -447,8 +445,6 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
AVMNodeDescriptor childDesc = AVMNodeDescriptor childDesc =
childNode.getDescriptor(dir.getPath(), child.getKey().getName(), dir.getIndirection(), dir.getIndirectionVersion()); childNode.getDescriptor(dir.getPath(), child.getKey().getName(), dir.getIndirection(), dir.getIndirectionVersion());
listing.put(child.getKey().getName(), childDesc); listing.put(child.getKey().getName(), childDesc);
AVMDAOs.Instance().fAVMNodeDAO.evict(childNode);
AVMDAOs.Instance().fChildEntryDAO.evict(child);
} }
return listing; return listing;
} }
@@ -481,7 +477,6 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
listing.get(name).getDescriptor(dir.getPath(), name, listing.get(name).getDescriptor(dir.getPath(), name,
lookup.getCurrentIndirection(), lookup.getCurrentIndirection(),
lookup.getCurrentIndirectionVersion())); lookup.getCurrentIndirectionVersion()));
AVMDAOs.Instance().fAVMNodeDAO.evict(listing.get(name));
} }
} }
} }
@@ -499,8 +494,6 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
child.getKey().getName(), child.getKey().getName(),
dir.getIndirection(), dir.getIndirection(),
dir.getIndirectionVersion())); dir.getIndirectionVersion()));
AVMDAOs.Instance().fAVMNodeDAO.evict(child.getChild());
AVMDAOs.Instance().fChildEntryDAO.evict(child);
} }
} }
return baseListing; return baseListing;
@@ -543,7 +536,8 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
{ {
return null; return null;
} }
return new Pair<AVMNode, Boolean>(AVMNodeUnwrapper.Unwrap(entry.getChild()), true); Pair<AVMNode, Boolean> result = new Pair<AVMNode, Boolean>(AVMNodeUnwrapper.Unwrap(entry.getChild()), true);
return result;
} }
// Don't check our underlying directory if we are opaque. // Don't check our underlying directory if we are opaque.
if (fOpacity) if (fOpacity)
@@ -593,8 +587,6 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
name, name,
mine.getIndirection(), mine.getIndirection(),
mine.getIndirectionVersion()); mine.getIndirectionVersion());
AVMDAOs.Instance().fAVMNodeDAO.evict(entry.getChild());
AVMDAOs.Instance().fChildEntryDAO.evict(entry);
return desc; return desc;
} }
// If we are opaque don't check underneath. // If we are opaque don't check underneath.
@@ -612,7 +604,6 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
return null; return null;
} }
AVMNodeDescriptor desc = child.getFirst().getDescriptor(lookup); AVMNodeDescriptor desc = child.getFirst().getDescriptor(lookup);
AVMDAOs.Instance().fAVMNodeDAO.evict(child.getFirst());
return desc; return desc;
} }
else else
@@ -952,7 +943,6 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
{ {
ChildEntry entry = AVMDAOs.Instance().fChildEntryDAO.get(key); ChildEntry entry = AVMDAOs.Instance().fChildEntryDAO.get(key);
AVMDAOs.Instance().fChildEntryDAO.delete(entry); AVMDAOs.Instance().fChildEntryDAO.delete(entry);
AVMDAOs.Instance().fAVMNodeDAO.flush();
} }
} }
// Make the new ChildEntry and save. // Make the new ChildEntry and save.

View File

@@ -115,7 +115,6 @@ class PlainDirectoryNodeImpl extends DirectoryNodeImpl implements PlainDirectory
continue; continue;
} }
result.put(child.getKey().getName(), AVMNodeUnwrapper.Unwrap(child.getChild())); result.put(child.getKey().getName(), AVMNodeUnwrapper.Unwrap(child.getChild()));
AVMDAOs.Instance().fChildEntryDAO.evict(child);
} }
return result; return result;
} }
@@ -166,8 +165,6 @@ class PlainDirectoryNodeImpl extends DirectoryNodeImpl implements PlainDirectory
child.getKey().getName(), child.getKey().getName(),
dir.getIndirection(), dir.getIndirection(),
dir.getIndirectionVersion())); dir.getIndirectionVersion()));
AVMDAOs.Instance().fAVMNodeDAO.evict(child.getChild());
AVMDAOs.Instance().fChildEntryDAO.evict(child);
} }
return result; return result;
} }
@@ -193,14 +190,19 @@ class PlainDirectoryNodeImpl extends DirectoryNodeImpl implements PlainDirectory
{ {
ChildKey key = new ChildKey(this, name); ChildKey key = new ChildKey(this, name);
ChildEntry entry = AVMDAOs.Instance().fChildEntryDAO.get(key); ChildEntry entry = AVMDAOs.Instance().fChildEntryDAO.get(key);
if (entry == null || if (entry == null)
(!includeDeleted && entry.getChild().getType() == AVMNodeType.DELETED_NODE)) {
return null;
}
if (!includeDeleted && entry.getChild().getType() == AVMNodeType.DELETED_NODE)
{ {
return null; return null;
} }
// We're doing the hand unrolling of the proxy because // We're doing the hand unrolling of the proxy because
// Hibernate/CGLIB proxies are broken. // Hibernate/CGLIB proxies are broken.
return new Pair<AVMNode, Boolean>(AVMNodeUnwrapper.Unwrap(entry.getChild()), true);
Pair<AVMNode, Boolean> result = new Pair<AVMNode, Boolean>(AVMNodeUnwrapper.Unwrap(entry.getChild()), true);
return result;
} }
/** /**
@@ -223,8 +225,6 @@ class PlainDirectoryNodeImpl extends DirectoryNodeImpl implements PlainDirectory
return null; return null;
} }
AVMNodeDescriptor desc = entry.getChild().getDescriptor(mine.getPath(), name, (String)null, -1); AVMNodeDescriptor desc = entry.getChild().getDescriptor(mine.getPath(), name, (String)null, -1);
AVMDAOs.Instance().fAVMNodeDAO.evict(entry.getChild());
AVMDAOs.Instance().fChildEntryDAO.evict(entry);
return desc; return desc;
} }

View File

@@ -57,6 +57,7 @@ class AVMNodeDAOHibernate extends HibernateDaoSupport implements
public void save(AVMNode node) public void save(AVMNode node)
{ {
getSession().save(node); getSession().save(node);
SessionCacheChecker.instance.check();
} }
/** /**
@@ -66,6 +67,7 @@ class AVMNodeDAOHibernate extends HibernateDaoSupport implements
public void delete(AVMNode node) public void delete(AVMNode node)
{ {
getSession().delete(node); getSession().delete(node);
SessionCacheChecker.instance.check();
} }
/** /**
@@ -74,6 +76,7 @@ class AVMNodeDAOHibernate extends HibernateDaoSupport implements
*/ */
public AVMNode getByID(long id) public AVMNode getByID(long id)
{ {
SessionCacheChecker.instance.check();
return AVMNodeUnwrapper.Unwrap((AVMNode)getSession().get(AVMNodeImpl.class, id)); return AVMNodeUnwrapper.Unwrap((AVMNode)getSession().get(AVMNodeImpl.class, id));
} }
@@ -215,6 +218,5 @@ class AVMNodeDAOHibernate extends HibernateDaoSupport implements
*/ */
public void evict(AVMNode node) public void evict(AVMNode node)
{ {
getSession().evict(node);
} }
} }

View File

@@ -66,6 +66,7 @@ class ChildEntryDAOHibernate extends HibernateDaoSupport implements
*/ */
public ChildEntry get(ChildKey key) public ChildEntry get(ChildKey key)
{ {
SessionCacheChecker.instance.check();
return (ChildEntry)getSession().get(ChildEntryImpl.class, key); return (ChildEntry)getSession().get(ChildEntryImpl.class, key);
} }
@@ -96,6 +97,7 @@ class ChildEntryDAOHibernate extends HibernateDaoSupport implements
"and ce.child = :child"); "and ce.child = :child");
query.setEntity("parent", parent); query.setEntity("parent", parent);
query.setEntity("child", child); query.setEntity("child", child);
SessionCacheChecker.instance.check();
return (ChildEntry)query.uniqueResult(); return (ChildEntry)query.uniqueResult();
} }
@@ -148,6 +150,5 @@ class ChildEntryDAOHibernate extends HibernateDaoSupport implements
*/ */
public void evict(ChildEntry entry) public void evict(ChildEntry entry)
{ {
getSession().evict(entry);
} }
} }

View File

@@ -0,0 +1,62 @@
/**
*
*/
package org.alfresco.repo.avm.hibernate;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.engine.EntityKey;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
/**
* @author britt
*/
public class SessionCacheChecker extends HibernateDaoSupport
{
public static SessionCacheChecker instance = null;
private static Log fgLogger = LogFactory.getLog(SessionCacheChecker.class);
private int fCount = 0;
public SessionCacheChecker()
{
instance = this;
}
public void check()
{
if (!fgLogger.isDebugEnabled())
{
return;
}
if (fCount % 1000 == 0)
{
Map<String, Integer> types = new HashMap<String, Integer>();
Set<EntityKey> keys = (Set<EntityKey>)getSession().getStatistics().getEntityKeys();
if (keys.size() > 200)
{
for (EntityKey key : keys)
{
String name = key.getEntityName();
if (!types.containsKey(name))
{
types.put(name, 0);
}
types.put(name, types.get(name) + 1);
}
fgLogger.debug(types);
// for (Object it : Thread.currentThread().getStackTrace())
// {
// fgLogger.debug(it);
// }
// fCount = 0;
}
}
fCount++;
}
}

View File

@@ -27,6 +27,7 @@ package org.alfresco.repo.domain.hibernate;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.Map; import java.util.Map;
import org.alfresco.repo.avm.hibernate.SessionCacheChecker;
import org.alfresco.repo.transaction.AlfrescoTransactionSupport; import org.alfresco.repo.transaction.AlfrescoTransactionSupport;
import org.alfresco.util.resource.MethodResourceManager; import org.alfresco.util.resource.MethodResourceManager;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
@@ -114,6 +115,11 @@ public class SessionSizeResourceManager extends HibernateDaoSupport implements M
long transactionElapsedTimeNs, long transactionElapsedTimeNs,
Method currentMethod) Method currentMethod)
{ {
if (logger.isDebugEnabled())
{
logger.debug("Session Size Manager Invoked.");
SessionCacheChecker.instance.check();
}
if (isDisableInTransaction()) if (isDisableInTransaction())
{ {
// Don't do anything // Don't do anything

View File

@@ -10,6 +10,7 @@ import org.aopalliance.intercept.MethodInvocation;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.hibernate.StaleObjectStateException; import org.hibernate.StaleObjectStateException;
import org.hibernate.StaleStateException;
import org.hibernate.exception.LockAcquisitionException; import org.hibernate.exception.LockAcquisitionException;
import org.springframework.aop.framework.ReflectiveMethodInvocation; import org.springframework.aop.framework.ReflectiveMethodInvocation;
import org.springframework.dao.ConcurrencyFailureException; import org.springframework.dao.ConcurrencyFailureException;
@@ -122,7 +123,8 @@ public class RetryingTransactionAdvice implements MethodInterceptor
if (t instanceof ConcurrencyFailureException || if (t instanceof ConcurrencyFailureException ||
t instanceof DeadlockLoserDataAccessException || t instanceof DeadlockLoserDataAccessException ||
t instanceof StaleObjectStateException || t instanceof StaleObjectStateException ||
t instanceof LockAcquisitionException) t instanceof LockAcquisitionException ||
t instanceof StaleStateException)
{ {
shouldRetry = true; shouldRetry = true;
try try

View File

@@ -39,6 +39,7 @@ import org.alfresco.service.transaction.TransactionService;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.hibernate.StaleObjectStateException; import org.hibernate.StaleObjectStateException;
import org.hibernate.StaleStateException;
import org.hibernate.exception.LockAcquisitionException; import org.hibernate.exception.LockAcquisitionException;
import org.springframework.dao.ConcurrencyFailureException; import org.springframework.dao.ConcurrencyFailureException;
import org.springframework.dao.DataIntegrityViolationException; import org.springframework.dao.DataIntegrityViolationException;
@@ -69,7 +70,8 @@ public class RetryingTransactionHelper
StaleObjectStateException.class, StaleObjectStateException.class,
LockAcquisitionException.class, LockAcquisitionException.class,
BatchUpdateException.class, BatchUpdateException.class,
DataIntegrityViolationException.class DataIntegrityViolationException.class,
StaleStateException.class
}; };
} }