Author: cbegin
Date: Fri Sep 5 12:41:29 2008
New Revision: 692516
URL: http://svn.apache.org/viewvc?rev=692516&view=rev
Log:
Made LRU and FIFO decorators.
Added:
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/FifoCache.java
- copied, changed from r692465,
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/FifoCache.java
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/LruCache.java
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/SuperCacheTest.java
Removed:
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/BaseCache.java
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/FifoCache.java
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/LruCache.java
Modified:
ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/main/java/com/ibatis/sqlmap/engine/builder/Ibatis2Configuration.java
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/WeakCache.java
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/PerpetualCache.java
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/FifoCacheTest.java
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/LruCacheTest.java
Modified:
ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/main/java/com/ibatis/sqlmap/engine/builder/Ibatis2Configuration.java
URL:
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/main/java/com/ibatis/sqlmap/engine/builder/Ibatis2Configuration.java?rev=692516&r1=692515&r2=692516&view=diff
==============================================================================
---
ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/main/java/com/ibatis/sqlmap/engine/builder/Ibatis2Configuration.java
(original)
+++
ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/main/java/com/ibatis/sqlmap/engine/builder/Ibatis2Configuration.java
Fri Sep 5 12:41:29 2008
@@ -5,8 +5,8 @@
import com.ibatis.sqlmap.engine.transaction.external.ExternalTransactionConfig;
import com.ibatis.sqlmap.engine.transaction.jdbc.JdbcTransactionConfig;
import com.ibatis.sqlmap.engine.transaction.jta.JtaTransactionConfig;
-import org.apache.ibatis.cache.impl.*;
-import org.apache.ibatis.cache.decorators.WeakCache;
+import org.apache.ibatis.cache.decorators.*;
+import org.apache.ibatis.cache.impl.PerpetualCache;
import org.apache.ibatis.mapping.Configuration;
import javax.sql.DataSource;
@@ -43,9 +43,9 @@
this.getTypeAliasRegistry().registerAlias("JNDI",
JndiDataSourceFactory.class.getName());
// CACHE ALIASES
- this.getTypeAliasRegistry().registerAlias("FIFO",
FifoCache.class.getName());
- this.getTypeAliasRegistry().registerAlias("LRU", LruCache.class.getName());
- this.getTypeAliasRegistry().registerAlias("MEMORY",
LruCache.class.getName());
+ this.getTypeAliasRegistry().registerAlias("FIFO",
PerpetualCache.class.getName());
+ this.getTypeAliasRegistry().registerAlias("LRU",
PerpetualCache.class.getName());
+ this.getTypeAliasRegistry().registerAlias("MEMORY",
PerpetualCache.class.getName());
}
public TransactionManager getTransactionManager() {
Copied:
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/FifoCache.java
(from r692465,
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/FifoCache.java)
URL:
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/FifoCache.java?p2=ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/FifoCache.java&p1=ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/FifoCache.java&r1=692465&r2=692516&rev=692516&view=diff
==============================================================================
---
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/FifoCache.java
(original)
+++
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/FifoCache.java
Fri Sep 5 12:41:29 2008
@@ -1,51 +1,68 @@
-package org.apache.ibatis.cache.impl;
+package org.apache.ibatis.cache.decorators;
-import org.apache.ibatis.cache.impl.BaseCache;
+import org.apache.ibatis.cache.Cache;
import java.util.*;
+import java.util.concurrent.locks.ReadWriteLock;
/**
- * FIFO (first in, first out) cache controller implementation
+ * FIFO (first in, first out) cache decorator
*/
-public class FifoCache extends BaseCache {
+public class FifoCache implements Cache {
- private int size = 1024;
- private Map cache = new HashMap();
- private List keyList = new LinkedList();
+ private final Cache delegate;
+ private final int size;
+ private final LinkedList keyList = new LinkedList();
- public int getSize() {
- return size;
+ public FifoCache(Cache delegate) {
+ this(delegate,1024);
}
- public void setSize(int size) {
+ public FifoCache(Cache delegate, int size) {
+ this.delegate = delegate;
this.size = size;
}
+ public String getId() {
+ return delegate.getId();
+ }
+
+ public int getSize() {
+ return delegate.getSize();
+ }
+
public void putObject(Object key, Object value) {
- cache.put(key, value);
- keyList.add(key);
- if (keyList.size() > size) {
- Object oldestKey = keyList.remove(0);
- cache.remove(oldestKey);
- }
+ cycleKeyList(key);
+ delegate.putObject(key, value);
}
public Object getObject(Object key) {
- return cache.get(key);
+ return delegate.getObject(key);
}
public boolean hasKey(Object key) {
- return cache.containsKey(key);
+ return delegate.hasKey(key);
}
public Object removeObject(Object key) {
- keyList.remove(key);
- return cache.remove(key);
+ return delegate.removeObject(key);
}
public void clear() {
- cache.clear();
+ delegate.clear();
keyList.clear();
}
+ public ReadWriteLock getReadWriteLock() {
+ return delegate.getReadWriteLock();
+ }
+
+ private void cycleKeyList(Object key) {
+ keyList.addLast(key);
+ if (keyList.size() > size) {
+ Object oldestKey = keyList.removeFirst();
+ delegate.removeObject(oldestKey);
+ }
+ }
+
}
Added:
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/LruCache.java
URL:
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/LruCache.java?rev=692516&view=auto
==============================================================================
---
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/LruCache.java
(added)
+++
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/LruCache.java
Fri Sep 5 12:41:29 2008
@@ -0,0 +1,80 @@
+package org.apache.ibatis.cache.decorators;
+
+import org.apache.ibatis.cache.Cache;
+
+import java.util.*;
+import java.util.concurrent.locks.ReadWriteLock;
+
+/**
+ * Lru (first in, first out) cache decorator
+ */
+public class LruCache implements Cache {
+
+ private final Cache delegate;
+
+ private final Map keyMap;
+
+ private Object eldestKey;
+
+ public LruCache(Cache delegate) {
+ this(delegate, 1024);
+ }
+
+ public LruCache(Cache delegate, final int size) {
+ this.delegate = delegate;
+ keyMap = new LinkedHashMap(size, .75F, true) {
+ protected boolean removeEldestEntry(Map.Entry eldest) {
+ eldestKey = eldest.getKey();
+ return size() > size;
+ }
+ };
+ }
+
+ public String getId() {
+ return delegate.getId();
+ }
+
+ public int getSize() {
+ return delegate.getSize();
+ }
+
+ public void putObject(Object key, Object value) {
+ cycleKeyList(key);
+ delegate.putObject(key, value);
+ }
+
+ public Object getObject(Object key) {
+ try {
+ return delegate.getObject(key);
+ } finally {
+ cycleKeyList(key);
+ }
+ }
+
+ public boolean hasKey(Object key) {
+ return delegate.hasKey(key);
+ }
+
+ public Object removeObject(Object key) {
+ return delegate.removeObject(key);
+ }
+
+ public void clear() {
+ delegate.clear();
+ keyMap.clear();
+ }
+
+ public ReadWriteLock getReadWriteLock() {
+ return delegate.getReadWriteLock();
+ }
+
+ private void cycleKeyList(Object key) {
+ keyMap.put(key,key);
+ if (eldestKey != null) {
+ delegate.removeObject(eldestKey);
+ eldestKey = null;
+ }
+ }
+
+}
+
Modified:
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/WeakCache.java
URL:
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/WeakCache.java?rev=692516&r1=692515&r2=692516&view=diff
==============================================================================
---
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/WeakCache.java
(original)
+++
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/WeakCache.java
Fri Sep 5 12:41:29 2008
@@ -1,6 +1,5 @@
package org.apache.ibatis.cache.decorators;
-import org.apache.ibatis.cache.impl.BaseCache;
import org.apache.ibatis.cache.Cache;
import java.util.*;
@@ -11,7 +10,7 @@
* Weak Reference cache decorator
* Thanks to Dr. Heinz Kabutz for his guidance here.
*/
-public class WeakCache extends BaseCache {
+public class WeakCache implements Cache {
private final int numberOfHardLinks;
private final LinkedList hardLinksToAvoidGarbageCollection = new
LinkedList();
private final ReferenceQueue queueOfGarbageCollectedEntries = new
ReferenceQueue();
Modified:
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/PerpetualCache.java
URL:
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/PerpetualCache.java?rev=692516&r1=692515&r2=692516&view=diff
==============================================================================
---
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/PerpetualCache.java
(original)
+++
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/PerpetualCache.java
Fri Sep 5 12:41:29 2008
@@ -1,13 +1,27 @@
package org.apache.ibatis.cache.impl;
-import org.apache.ibatis.cache.impl.BaseCache;
+
+import org.apache.ibatis.cache.*;
import java.util.*;
+import java.util.concurrent.locks.*;
+
+public class PerpetualCache implements Cache {
-public class PerpetualCache extends BaseCache {
+ private String id;
private Map cache = new HashMap();
+ private ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
public int getSize() {
return cache.size();
}
@@ -32,4 +46,23 @@
cache.clear();
}
+
+ public ReadWriteLock getReadWriteLock() {
+ return readWriteLock;
+ }
+
+ public boolean equals(Object o) {
+ if (getId() == null) throw new CacheException("Cache instances require an
ID.");
+ if (this == o) return true;
+ if (!(o instanceof Cache)) return false;
+
+ Cache otherCache = (Cache) o;
+ return getId().equals(otherCache.getId());
+ }
+
+ public int hashCode() {
+ if (getId() == null) throw new CacheException("Cache instances require an
ID.");
+ return getId().hashCode();
+ }
+
}
Modified:
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/FifoCacheTest.java
URL:
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/FifoCacheTest.java?rev=692516&r1=692515&r2=692516&view=diff
==============================================================================
---
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/FifoCacheTest.java
(original)
+++
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/FifoCacheTest.java
Fri Sep 5 12:41:29 2008
@@ -1,14 +1,14 @@
package org.apache.ibatis.cache;
-import org.apache.ibatis.cache.impl.FifoCache;
+import org.apache.ibatis.cache.decorators.FifoCache;
+import org.apache.ibatis.cache.impl.PerpetualCache;
import org.junit.*;
public class FifoCacheTest {
@Test
public void shouldRemoveFirstItemInBeyondFiveEntries() {
- FifoCache cache = new FifoCache();
- cache.setSize(5);
+ FifoCache cache = new FifoCache(new PerpetualCache(),5);
for (int i = 0; i < 5; i++) {
cache.putObject(i, i);
}
@@ -20,7 +20,7 @@
@Test
public void shouldRemoveItemOnDemand() {
- Cache cache = new FifoCache();
+ FifoCache cache = new FifoCache(new PerpetualCache());
cache.putObject(0, 0);
Assert.assertNotNull(cache.getObject(0));
cache.removeObject(0);
@@ -29,7 +29,7 @@
@Test
public void shouldFlushAllItemsOnDemand() {
- Cache cache = new FifoCache();
+ FifoCache cache = new FifoCache(new PerpetualCache());
for (int i = 0; i < 5; i++) {
cache.putObject(i, i);
}
Modified:
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/LruCacheTest.java
URL:
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/LruCacheTest.java?rev=692516&r1=692515&r2=692516&view=diff
==============================================================================
---
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/LruCacheTest.java
(original)
+++
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/LruCacheTest.java
Fri Sep 5 12:41:29 2008
@@ -1,14 +1,14 @@
package org.apache.ibatis.cache;
-import org.apache.ibatis.cache.impl.LruCache;
+import org.apache.ibatis.cache.decorators.LruCache;
+import org.apache.ibatis.cache.impl.PerpetualCache;
import org.junit.*;
public class LruCacheTest {
@Test
public void shouldRemoveLeastRecentlyUsedItemInBeyondFiveEntries() {
- LruCache cache = new LruCache();
- cache.setSize(5);
+ LruCache cache = new LruCache(new PerpetualCache(),5);
for (int i = 0; i < 5; i++) {
cache.putObject(i, i);
}
@@ -20,7 +20,7 @@
@Test
public void shouldRemoveItemOnDemand() {
- Cache cache = new LruCache();
+ Cache cache = new LruCache(new PerpetualCache());
cache.putObject(0, 0);
Assert.assertNotNull(cache.getObject(0));
cache.removeObject(0);
@@ -29,7 +29,7 @@
@Test
public void shouldFlushAllItemsOnDemand() {
- Cache cache = new LruCache();
+ Cache cache = new LruCache(new PerpetualCache());
for (int i = 0; i < 5; i++) {
cache.putObject(i, i);
}
Added:
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/SuperCacheTest.java
URL:
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/SuperCacheTest.java?rev=692516&view=auto
==============================================================================
---
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/SuperCacheTest.java
(added)
+++
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/cache/SuperCacheTest.java
Fri Sep 5 12:41:29 2008
@@ -0,0 +1,27 @@
+package org.apache.ibatis.cache;
+
+import org.junit.*;
+import org.apache.ibatis.cache.impl.PerpetualCache;
+import org.apache.ibatis.cache.decorators.*;
+
+public class SuperCacheTest {
+
+ @Test
+ public void
shouldDemonstrate5LevelSuperCacheHandlesLotsOfEntriesWithoutCrashing() {
+ final int N = 1000000;
+ Cache cache = new PerpetualCache();
+ cache = new LruCache(cache,500000);
+ cache = new FifoCache(cache,500000);
+ cache = new SoftCache(cache);
+ cache = new WeakCache(cache);
+ for (int i = 0; i < N; i++) {
+ cache.putObject(i, i);
+ Object o = cache.getObject(i);
+ Assert.assertTrue(o == null || i == ((Integer) o));
+ }
+ System.out.println(cache.getSize());
+ Assert.assertTrue(cache.getSize() < N);
+ }
+
+
+}