You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ibatis.apache.org by gb...@apache.org on 2005/12/14 19:37:39 UTC
svn commit: r356824 - in /ibatis/trunk/cs/mapper:
IBatisNet.DataMapper.Test/NUnit/SqlMapTests/
IBatisNet.DataMapper/Configuration/Cache/
IBatisNet.DataMapper/MappedStatements/
Author: gbayon
Date: Wed Dec 14 10:37:26 2005
New Revision: 356824
URL: http://svn.apache.org/viewcvs?rev=356824&view=rev
Log:
- Clean Cache code
- Add unit test for IBATISNET-134
Modified:
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/CacheKeyTest.cs
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/CacheTest.cs
ibatis/trunk/cs/mapper/IBatisNet.DataMapper/Configuration/Cache/CacheModel.cs
ibatis/trunk/cs/mapper/IBatisNet.DataMapper/MappedStatements/CachingStatement.cs
Modified: ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/CacheKeyTest.cs
URL: http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/CacheKeyTest.cs?rev=356824&r1=356823&r2=356824&view=diff
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/CacheKeyTest.cs (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/CacheKeyTest.cs Wed Dec 14 10:37:26 2005
@@ -1,5 +1,6 @@
+using IBatisNet.DataMapper.Configuration.Cache;
using NUnit.Framework;
namespace IBatisNet.DataMapper.Test.NUnit.SqlMapTests
@@ -27,11 +28,11 @@
private static void DoTestClassEquals(long firstLong, long secondLong)
{
// Two cache keys are equal except for the parameter.
- Configuration.Cache.CacheKey key = new Configuration.Cache.CacheKey();
+ CacheKey key = new CacheKey();
key.Update(firstLong);
- Configuration.Cache.CacheKey aDifferentKey = new Configuration.Cache.CacheKey();
+ CacheKey aDifferentKey = new CacheKey();
key.Update(secondLong);
@@ -41,8 +42,8 @@
[Test]
public void CacheKeyWithSameHashcode()
{
- Configuration.Cache.CacheKey key1 = new Configuration.Cache.CacheKey();
- Configuration.Cache.CacheKey key2 = new Configuration.Cache.CacheKey();
+ CacheKey key1 = new CacheKey();
+ CacheKey key2 = new CacheKey();
key1.Update("HS1CS001");
key2.Update("HS1D4001");
@@ -54,8 +55,8 @@
[Test]
public void CacheKeyWithTwoParamsSameHashcode()
{
- Configuration.Cache.CacheKey key1 = new Configuration.Cache.CacheKey();
- Configuration.Cache.CacheKey key2 = new Configuration.Cache.CacheKey();
+ CacheKey key1 = new CacheKey();
+ CacheKey key2 = new CacheKey();
key1.Update("HS1CS001");
key1.Update("HS1D4001");
Modified: ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/CacheTest.cs
URL: http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/CacheTest.cs?rev=356824&r1=356823&r2=356824&view=diff
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/CacheTest.cs (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/CacheTest.cs Wed Dec 14 10:37:26 2005
@@ -164,9 +164,12 @@
public void TestCacheNullObject()
{
CacheModel cache = GetCacheModel();
- cache["testKey"] = null;
+ CacheKey key = new CacheKey();
+ key.Update("testKey");
- object returnedObject = cache["testKey"];
+ cache[key] = null;
+
+ object returnedObject = cache[key];
Assert.AreEqual(CacheModel.NULL_OBJECT, returnedObject);
Assert.AreEqual(HashCodeProvider.GetIdentityHashCode(CacheModel.NULL_OBJECT), HashCodeProvider.GetIdentityHashCode(returnedObject));
Assert.AreEqual(1, cache.HitRatio);
@@ -180,10 +183,13 @@
public void TestCacheHit()
{
CacheModel cache = GetCacheModel();
+ CacheKey key = new CacheKey();
+ key.Update("testKey");
+
string value = "testValue";
- cache["testKey"] = value;
+ cache[key] = value;
- object returnedObject = cache["testKey"];
+ object returnedObject = cache[key];
Assert.AreEqual(value, returnedObject);
Assert.AreEqual(HashCodeProvider.GetIdentityHashCode(value), HashCodeProvider.GetIdentityHashCode(returnedObject));
Assert.AreEqual(1, cache.HitRatio);
@@ -196,10 +202,16 @@
public void TestCacheMiss()
{
CacheModel cache = GetCacheModel();
+ CacheKey key = new CacheKey();
+ key.Update("testKey");
+
string value = "testValue";
- cache["testKey"] = value;
+ cache[key] = value;
- object returnedObject = cache["wrongKey"];
+ CacheKey wrongKey = new CacheKey();
+ wrongKey.Update("wrongKey");
+
+ object returnedObject = cache[wrongKey];
Assert.IsTrue(!value.Equals(returnedObject));
Assert.IsNull(returnedObject) ;
Assert.AreEqual(0, cache.HitRatio);
@@ -212,19 +224,51 @@
public void TestCacheHitMiss()
{
CacheModel cache = GetCacheModel();
+ CacheKey key = new CacheKey();
+ key.Update("testKey");
+
string value = "testValue";
- cache["testKey"] = value;
+ cache[key] = value;
- object returnedObject = cache["testKey"];
+ object returnedObject = cache[key];
Assert.AreEqual(value, returnedObject);
Assert.AreEqual(HashCodeProvider.GetIdentityHashCode(value), HashCodeProvider.GetIdentityHashCode(returnedObject));
- returnedObject = cache["wrongKey"];
+ CacheKey wrongKey = new CacheKey();
+ wrongKey.Update("wrongKey");
+
+ returnedObject = cache[wrongKey];
Assert.IsTrue(!value.Equals(returnedObject));
Assert.IsNull(returnedObject) ;
Assert.AreEqual(0.5, cache.HitRatio);
}
+
+ /// <summary>
+ /// Test Duplicate Add to Cache
+ /// </summary>
+ /// <remarks>IBATISNET-134</remarks>
+ [Test]
+ public void TestDuplicateAddCache()
+ {
+ CacheModel cache = GetCacheModel();
+ CacheKey key = new CacheKey();
+ key.Update("testKey");
+ string value = "testValue";
+
+ object obj = null;
+ obj = cache[key];
+ Assert.IsNull(obj);
+ obj = cache[key];
+ Assert.IsNull(obj);
+
+ cache[key] = value;
+ cache[key] = value;
+
+ object returnedObject = cache[key];
+ Assert.AreEqual(value, returnedObject);
+ Assert.AreEqual(HashCodeProvider.GetIdentityHashCode(value), HashCodeProvider.GetIdentityHashCode(returnedObject));
+ }
private CacheModel GetCacheModel()
{
Modified: ibatis/trunk/cs/mapper/IBatisNet.DataMapper/Configuration/Cache/CacheModel.cs
URL: http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.DataMapper/Configuration/Cache/CacheModel.cs?rev=356824&r1=356823&r2=356824&view=diff
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.DataMapper/Configuration/Cache/CacheModel.cs (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.DataMapper/Configuration/Cache/CacheModel.cs Wed Dec 14 10:37:26 2005
@@ -30,13 +30,13 @@
using System.Collections;
using System.Collections.Specialized;
using System.Reflection;
+using System.Runtime.CompilerServices;
using System.Xml.Serialization;
using IBatisNet.Common.Exceptions;
using IBatisNet.Common.Logging;
using IBatisNet.Common.Utilities;
using IBatisNet.DataMapper.Exceptions;
using IBatisNet.DataMapper.MappedStatements;
-using IBatisNet.DataMapper.Scope;
#endregion
@@ -52,6 +52,8 @@
{
#region Fields
+ private static IDictionary _lockMap = new HybridDictionary();
+
[NonSerialized]
private static readonly ILog _logger = LogManager.GetLogger( MethodBase.GetCurrentMethod().DeclaringType );
/// <summary>
@@ -233,7 +235,7 @@
/// A side effect of this method is that is may clear the cache
/// if it has not been cleared in the flushInterval.
/// </remarks>
- public object this [object key]
+ public object this [CacheKey key]
{
get
{
@@ -246,7 +248,11 @@
}
}
- object value = _controller[key];
+ object value = null;
+ lock (GetLock(key))
+ {
+ value = _controller[key];
+ }
lock(_statLock)
{
@@ -295,5 +301,24 @@
}
#endregion
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="key"></param>
+ /// <returns></returns>
+ [MethodImpl(MethodImplOptions.Synchronized)]
+ public object GetLock(CacheKey key)
+ {
+ int controllerId = HashCodeProvider.GetIdentityHashCode(_controller);
+ int keyHash = key.GetHashCode();
+ int lockKey = 29 * controllerId + keyHash;
+ object lok =_lockMap[lockKey];
+ if (lok == null)
+ {
+ lok = lockKey; //might as well use the same object
+ _lockMap[lockKey] = lok;
+ }
+ return lok;
+ }
}
}
Modified: ibatis/trunk/cs/mapper/IBatisNet.DataMapper/MappedStatements/CachingStatement.cs
URL: http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.DataMapper/MappedStatements/CachingStatement.cs?rev=356824&r1=356823&r2=356824&view=diff
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.DataMapper/MappedStatements/CachingStatement.cs (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.DataMapper/MappedStatements/CachingStatement.cs Wed Dec 14 10:37:26 2005
@@ -30,11 +30,8 @@
using IBatisNet.Common;
using IBatisNet.DataMapper.Commands;
using IBatisNet.DataMapper.Configuration.Cache;
-using IBatisNet.DataMapper.Configuration.ParameterMapping;
using IBatisNet.DataMapper.Configuration.Statements;
using IBatisNet.DataMapper.Scope;
-using IBatisNet.DataMapper.MappedStatements;
-using Cache = IBatisNet.DataMapper.Configuration.Cache;
#endregion
@@ -61,22 +58,6 @@
_mappedStatement = statement;
}
- /// <summary>
- /// Gets a percentage of successful cache hits achieved
- /// </summary>
- /// <returns>The percentage of hits (0-1), or -1 if cache is disabled.</returns>
- public double GetDataCacheHitRatio()
- {
- if (_mappedStatement.Statement.CacheModel != null)
- {
- return _mappedStatement.Statement.CacheModel.HitRatio;
- }
- else
- {
- return -1;
- }
- }
-
#region IMappedStatement Members
/// <summary>
@@ -130,7 +111,7 @@
_mappedStatement.PreparedCommand.Create( request, session, this.Statement, parameterObject );
- Cache.CacheKey cacheKey = this.GetCacheKey(request);
+ CacheKey cacheKey = this.GetCacheKey(request);
cacheKey.Update("ExecuteQueryForMap");
cacheKey.Update(keyProperty);
cacheKey.Update(valueProperty);
@@ -198,7 +179,7 @@
_mappedStatement.PreparedCommand.Create( request, session, this.Statement, parameterObject );
- Cache.CacheKey cacheKey = this.GetCacheKey(request);
+ CacheKey cacheKey = this.GetCacheKey(request);
cacheKey.Update("ExecuteQueryForList");
cacheKey.Update(skipResults);
cacheKey.Update(maxResults);
@@ -252,7 +233,7 @@
_mappedStatement.PreparedCommand.Create( request, session, this.Statement, parameterObject );
- Cache.CacheKey cacheKey = this.GetCacheKey(request);
+ CacheKey cacheKey = this.GetCacheKey(request);
cacheKey.Update("ExecuteQueryForObject");
obj = this.Statement.CacheModel[cacheKey];
@@ -302,9 +283,25 @@
#endregion
- private Cache.CacheKey GetCacheKey(RequestScope request)
+ /// <summary>
+ /// Gets a percentage of successful cache hits achieved
+ /// </summary>
+ /// <returns>The percentage of hits (0-1), or -1 if cache is disabled.</returns>
+ public double GetDataCacheHitRatio()
+ {
+ if (_mappedStatement.Statement.CacheModel != null)
+ {
+ return _mappedStatement.Statement.CacheModel.HitRatio;
+ }
+ else
+ {
+ return -1;
+ }
+ }
+
+ private CacheKey GetCacheKey(RequestScope request)
{
- Cache.CacheKey cacheKey = new Cache.CacheKey();
+ CacheKey cacheKey = new CacheKey();
for (int i = 0; i < request.IDbCommand.Parameters.Count; i++)
{
IDataParameter dataParameter = (IDataParameter)request.IDbCommand.Parameters[i];