Fixed memory leak where transactional cache was NOT used during a transaction, i.e. cleanup was not being performed if the cache was not used

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@2307 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Derek Hulley
2006-02-06 16:54:07 +00:00
parent c396613cdd
commit f4b281fc7e

View File

@@ -201,6 +201,12 @@ public class TransactionalCache<K extends Serializable, V extends Serializable>
{
throw new AlfrescoRuntimeException("Failed to add txn caches to manager", e);
}
finally
{
// ensure that we get the transaction callbacks as we have bound the unique
// transactional caches to a common manager
AlfrescoTransactionSupport.bindListener(this);
}
AlfrescoTransactionSupport.bindResource(resourceKeyTxnData, data);
}
return data;
@@ -324,12 +330,6 @@ public class TransactionalCache<K extends Serializable, V extends Serializable>
else // transaction present
{
TransactionData txnData = getTransactionData();
// register for callbacks
if (!txnData.listenerBound)
{
AlfrescoTransactionSupport.bindListener(this);
txnData.listenerBound = true;
}
// we have a transaction - add the item into the updated cache for this transaction
// are we in an overflow condition?
if (txnData.updatedItemsCache.getMemoryStoreSize() >= maxCacheSize)
@@ -378,12 +378,6 @@ public class TransactionalCache<K extends Serializable, V extends Serializable>
else // transaction present
{
TransactionData txnData = getTransactionData();
// register for callbacks
if (!txnData.listenerBound)
{
AlfrescoTransactionSupport.bindListener(this);
txnData.listenerBound = true;
}
// is the shared cache going to be cleared?
if (txnData.isClearOn)
{
@@ -440,12 +434,6 @@ public class TransactionalCache<K extends Serializable, V extends Serializable>
}
TransactionData txnData = getTransactionData();
// register for callbacks
if (!txnData.listenerBound)
{
AlfrescoTransactionSupport.bindListener(this);
txnData.listenerBound = true;
}
// the shared cache must be cleared at the end of the transaction
// and also serves to ensure that the shared cache will be ignored
// for the remainder of the transaction
@@ -498,7 +486,8 @@ public class TransactionalCache<K extends Serializable, V extends Serializable>
}
TransactionData txnData = getTransactionData();
try
{
if (txnData.isClearOn)
{
// clear shared cache
@@ -523,9 +512,8 @@ public class TransactionalCache<K extends Serializable, V extends Serializable>
logger.debug("Removed " + keys.size() + " values from shared cache");
}
}
// transfer updates
try
{
List<Serializable> keys = txnData.updatedItemsCache.getKeys();
for (Serializable key : keys)
{
@@ -541,10 +529,10 @@ public class TransactionalCache<K extends Serializable, V extends Serializable>
{
throw new AlfrescoRuntimeException("Failed to transfer updates to shared cache", e);
}
// drop caches from cachemanager
cacheManager.removeCache(txnData.updatedItemsCache.getName());
cacheManager.removeCache(txnData.removedItemsCache.getName());
finally
{
removeCaches(txnData);
}
}
/**
@@ -553,8 +541,17 @@ public class TransactionalCache<K extends Serializable, V extends Serializable>
public void afterRollback()
{
TransactionData txnData = getTransactionData();
// drop caches from cachemanager
removeCaches(txnData);
}
/**
* Ensures that the transactional caches are removed from the common cache manager.
*
* @param txnData the data with references to the the transactional caches
*/
private void removeCaches(TransactionData txnData)
{
cacheManager.removeCache(txnData.updatedItemsCache.getName());
cacheManager.removeCache(txnData.removedItemsCache.getName());
}
@@ -565,6 +562,5 @@ public class TransactionalCache<K extends Serializable, V extends Serializable>
public Cache updatedItemsCache;
public Cache removedItemsCache;
public boolean isClearOn;
public boolean listenerBound;
}
}