Author: cbegin
Date: Thu Sep 4 23:19:54 2008
New Revision: 692345
URL: http://svn.apache.org/viewvc?rev=692345&view=rev
Log:
Introduced transactional cache
Added:
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/TransactionalCacheManager.java
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/TransactionalCache.java
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/BaseCache.java
- copied, changed from r692224,
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/BaseCache.java
Removed:
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/BaseCache.java
Modified:
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/Cache.java
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/LoggingCache.java
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/ScheduledCache.java
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/SerializedCache.java
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/SynchronizedCache.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
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/main/java/org/apache/ibatis/cache/impl/SoftCache.java
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/WeakCache.java
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/CachingExecutor.java
ibatis/trunk/java/ibatis-3/ibatis-3-monarch/src/test/java/org/apache/ibatis/monarch/example/BlogMapper.xml
ibatis/trunk/java/ibatis-3/ibatis-3-monarch/src/test/java/org/apache/ibatis/monarch/example/MapperConfig.xml
Modified:
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/Cache.java
URL:
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/Cache.java?rev=692345&r1=692344&r2=692345&view=diff
==============================================================================
---
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/Cache.java
(original)
+++
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/Cache.java
Thu Sep 4 23:19:54 2008
@@ -3,6 +3,8 @@
import org.apache.ibatis.cache.decorators.*;
import org.apache.ibatis.reflection.MetaObject;
+import java.util.concurrent.locks.ReadWriteLock;
+
public interface Cache {
String getId();
@@ -19,6 +21,8 @@
void clear();
+ ReadWriteLock getReadWriteLock();
+
public class Builder {
private String id;
private Class implementation;
Added:
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/TransactionalCacheManager.java
URL:
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/TransactionalCacheManager.java?rev=692345&view=auto
==============================================================================
---
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/TransactionalCacheManager.java
(added)
+++
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/TransactionalCacheManager.java
Thu Sep 4 23:19:54 2008
@@ -0,0 +1,40 @@
+package org.apache.ibatis.cache;
+
+import org.apache.ibatis.cache.decorators.TransactionalCache;
+
+import java.util.*;
+
+public class TransactionalCacheManager {
+
+ private Map<Cache, TransactionalCache> transactionalCaches = new
HashMap<Cache, TransactionalCache>();
+
+ public void clear(Cache cache) {
+ getTransactionalCache(cache).clear();
+ }
+
+ public void putObject(Cache cache, CacheKey key, Object value) {
+ getTransactionalCache(cache).putObject(key, value);
+ }
+
+ public void commit() {
+ for(TransactionalCache txCache : transactionalCaches.values()) {
+ txCache.commit();
+ }
+ }
+
+ public void rollback() {
+ for(TransactionalCache txCache : transactionalCaches.values()) {
+ txCache.rollback();
+ }
+ }
+
+ private TransactionalCache getTransactionalCache(Cache cache) {
+ TransactionalCache txCache = transactionalCaches.get(cache);
+ if (txCache == null) {
+ txCache = new TransactionalCache(cache);
+ transactionalCaches.put(cache,txCache);
+ }
+ return txCache;
+ }
+
+}
Modified:
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/LoggingCache.java
URL:
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/LoggingCache.java?rev=692345&r1=692344&r2=692345&view=diff
==============================================================================
---
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/LoggingCache.java
(original)
+++
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/LoggingCache.java
Thu Sep 4 23:19:54 2008
@@ -3,7 +3,9 @@
import org.apache.ibatis.cache.*;
import org.apache.ibatis.logging.*;
-public class LoggingCache extends BaseCache {
+import java.util.concurrent.locks.ReadWriteLock;
+
+public class LoggingCache implements Cache {
private static final Log log = LogFactory.getLog(LoggingCache.class);
@@ -50,6 +52,18 @@
delegate.clear();
}
+ public ReadWriteLock getReadWriteLock() {
+ return delegate.getReadWriteLock();
+ }
+
+ public int hashCode() {
+ return delegate.hashCode();
+ }
+
+ public boolean equals(Object obj) {
+ return delegate.equals(obj);
+ }
+
private double getHitRatio() {
return (double) hits / (double) requests;
}
Modified:
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/ScheduledCache.java
URL:
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/ScheduledCache.java?rev=692345&r1=692344&r2=692345&view=diff
==============================================================================
---
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/ScheduledCache.java
(original)
+++
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/ScheduledCache.java
Thu Sep 4 23:19:54 2008
@@ -2,7 +2,9 @@
import org.apache.ibatis.cache.*;
-public class ScheduledCache extends BaseCache {
+import java.util.concurrent.locks.ReadWriteLock;
+
+public class ScheduledCache implements Cache {
private Cache delegate;
protected long clearInterval = 60 * 60 * 1000; // 1 hour
@@ -65,6 +67,18 @@
delegate.clear();
}
+ public ReadWriteLock getReadWriteLock() {
+ return delegate.getReadWriteLock();
+ }
+
+ public int hashCode() {
+ return delegate.hashCode();
+ }
+
+ public boolean equals(Object obj) {
+ return delegate.equals(obj);
+ }
+
private boolean clearWhenStale() {
if (System.currentTimeMillis() - lastClear > clearInterval) {
clear();
Modified:
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/SerializedCache.java
URL:
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/SerializedCache.java?rev=692345&r1=692344&r2=692345&view=diff
==============================================================================
---
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/SerializedCache.java
(original)
+++
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/SerializedCache.java
Thu Sep 4 23:19:54 2008
@@ -3,8 +3,9 @@
import org.apache.ibatis.cache.*;
import java.io.*;
+import java.util.concurrent.locks.ReadWriteLock;
-public class SerializedCache extends BaseCache {
+public class SerializedCache implements Cache {
private Cache delegate;
@@ -45,6 +46,10 @@
delegate.clear();
}
+ public ReadWriteLock getReadWriteLock() {
+ return delegate.getReadWriteLock();
+ }
+
private byte[] serialize(Serializable value) {
try {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
Modified:
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/SynchronizedCache.java
URL:
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/SynchronizedCache.java?rev=692345&r1=692344&r2=692345&view=diff
==============================================================================
---
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/SynchronizedCache.java
(original)
+++
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/SynchronizedCache.java
Thu Sep 4 23:19:54 2008
@@ -2,7 +2,9 @@
import org.apache.ibatis.cache.*;
-public class SynchronizedCache extends BaseCache {
+import java.util.concurrent.locks.ReadWriteLock;
+
+public class SynchronizedCache implements Cache {
private Cache delegate;
@@ -14,28 +16,87 @@
return delegate.getId();
}
- public synchronized int getSize() {
- return delegate.getSize();
+ public int getSize() {
+ acquireReadLock();
+ try {
+ return delegate.getSize();
+ } finally {
+ releaseReadLock();
+ }
+ }
+
+ public void putObject(Object key, Object object) {
+ acquireWriteLock();
+ try {
+ delegate.putObject(key, object);
+ } finally {
+ releaseWriteLock();
+ }
+ }
+
+ public Object getObject(Object key) {
+ acquireReadLock();
+ try {
+ return delegate.getObject(key);
+ } finally {
+ releaseReadLock();
+ }
+ }
+
+ public boolean hasKey(Object key) {
+ acquireReadLock();
+ try {
+ return delegate.hasKey(key);
+ } finally {
+ releaseReadLock();
+ }
+ }
+
+ public Object removeObject(Object key) {
+ acquireWriteLock();
+ try {
+ return delegate.removeObject(key);
+ } finally {
+ releaseWriteLock();
+ }
+ }
+
+
+ public void clear() {
+ acquireWriteLock();
+ try {
+ delegate.clear();
+ } finally {
+ releaseWriteLock();
+ }
+ }
+
+ public ReadWriteLock getReadWriteLock() {
+ return delegate.getReadWriteLock();
+ }
+
+ public int hashCode() {
+ return delegate.hashCode();
}
- public synchronized void putObject(Object key, Object object) {
- delegate.putObject(key, object);
+ public boolean equals(Object obj) {
+ return delegate.equals(obj);
}
- public synchronized Object getObject(Object key) {
- return delegate.getObject(key);
+ private void acquireReadLock() {
+ getReadWriteLock().readLock().lock();
}
- public synchronized boolean hasKey(Object key) {
- return delegate.hasKey(key);
+ private void releaseReadLock() {
+ getReadWriteLock().readLock().unlock();
}
- public synchronized Object removeObject(Object key) {
- return delegate.removeObject(key);
+ private void acquireWriteLock() {
+ getReadWriteLock().writeLock().lock();
}
- public synchronized void clear() {
- delegate.clear();
+ private void releaseWriteLock() {
+ getReadWriteLock().writeLock().unlock();
}
}
Added:
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/TransactionalCache.java
URL:
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/TransactionalCache.java?rev=692345&view=auto
==============================================================================
---
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/TransactionalCache.java
(added)
+++
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/decorators/TransactionalCache.java
Thu Sep 4 23:19:54 2008
@@ -0,0 +1,117 @@
+package org.apache.ibatis.cache.decorators;
+
+import org.apache.ibatis.cache.*;
+
+import java.util.*;
+import java.util.concurrent.locks.ReadWriteLock;
+
+public class TransactionalCache implements Cache {
+
+ private Cache delegate;
+ private boolean clearOnCommit;
+ private Map<Object, AddEntry> entriesToAddOnCommit;
+ private Map<Object, RemoveEntry> entriesToRemoveOnCommit;
+
+ public TransactionalCache(Cache delegate) {
+ this.delegate = delegate;
+ this.clearOnCommit = false;
+ this.entriesToAddOnCommit = new HashMap<Object, AddEntry>();
+ this.entriesToRemoveOnCommit = new HashMap<Object, RemoveEntry>();
+ }
+
+ public String getId() {
+ return delegate.getId();
+ }
+
+ public int getSize() {
+ return delegate.getSize();
+ }
+
+ public Object getObject(Object key) {
+ return delegate.getObject(key);
+ }
+
+ public boolean hasKey(Object key) {
+ return delegate.hasKey(key);
+ }
+
+ public ReadWriteLock getReadWriteLock() {
+ return delegate.getReadWriteLock();
+ }
+
+ public void putObject(Object key, Object object) {
+ entriesToRemoveOnCommit.remove(key);
+ entriesToAddOnCommit.put(key, new AddEntry(delegate,key,object));
+ }
+
+ public Object removeObject(Object key) {
+ entriesToAddOnCommit.remove(key);
+ entriesToRemoveOnCommit.put(key, new RemoveEntry(delegate,key));
+ return delegate.getObject(key);
+ }
+
+ public void clear() {
+ clearOnCommit = true;
+ }
+
+ public void commit() {
+ delegate.getReadWriteLock().writeLock().lock();
+ try {
+ if (clearOnCommit) {
+ delegate.clear();
+ } else {
+ for (RemoveEntry entry : entriesToRemoveOnCommit.values()) {
+ entry.commit();
+ }
+ }
+ for (AddEntry entry : entriesToAddOnCommit.values()) {
+ entry.commit();
+ }
+ reset();
+ } finally {
+ delegate.getReadWriteLock().writeLock().unlock();
+ }
+ }
+
+ public void rollback() {
+ reset();
+ }
+
+ private void reset() {
+ clearOnCommit = false;
+ entriesToRemoveOnCommit.clear();
+ entriesToAddOnCommit.clear();
+ }
+
+ private static class AddEntry {
+ private Cache cache;
+ private Object key;
+ private Object value;
+
+ public AddEntry(Cache cache, Object key, Object value) {
+ this.cache = cache;
+ this.key = key;
+ this.value = value;
+ }
+
+ public void commit() {
+ cache.putObject(key, value);
+ }
+ }
+
+ private static class RemoveEntry {
+ private Cache cache;
+ private Object key;
+
+ public RemoveEntry(Cache cache, Object key) {
+ this.cache = cache;
+ this.key = key;
+ }
+
+ public void commit() {
+ cache.removeObject(key);
+ }
+ }
+
+
+}
Copied:
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/BaseCache.java
(from r692224,
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/BaseCache.java)
URL:
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/BaseCache.java?p2=ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/BaseCache.java&p1=ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/BaseCache.java&r1=692224&r2=692345&rev=692345&view=diff
==============================================================================
---
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/BaseCache.java
(original)
+++
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/BaseCache.java
Thu Sep 4 23:19:54 2008
@@ -1,4 +1,8 @@
-package org.apache.ibatis.cache;
+package org.apache.ibatis.cache.impl;
+
+import org.apache.ibatis.cache.*;
+
+import java.util.concurrent.locks.*;
/**
* Base Cache class implements a template method pattern for subclasses.
@@ -7,6 +11,8 @@
protected String id;
+ private ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
+
public String getId() {
return id;
}
@@ -15,14 +21,18 @@
this.id = id;
}
+ 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 BaseCache)) return false;
+ if (!(o instanceof Cache)) return false;
- BaseCache baseCache = (BaseCache) o;
+ Cache otherCache = (Cache) o;
- if (!getId().equals(baseCache.getId())) return false;
+ if (!getId().equals(otherCache.getId())) return false;
return true;
}
Modified:
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/impl/FifoCache.java?rev=692345&r1=692344&r2=692345&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/impl/FifoCache.java
Thu Sep 4 23:19:54 2008
@@ -1,6 +1,6 @@
package org.apache.ibatis.cache.impl;
-import org.apache.ibatis.cache.BaseCache;
+import org.apache.ibatis.cache.impl.BaseCache;
import java.util.*;
Modified:
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/LruCache.java
URL:
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/LruCache.java?rev=692345&r1=692344&r2=692345&view=diff
==============================================================================
---
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/LruCache.java
(original)
+++
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/LruCache.java
Thu Sep 4 23:19:54 2008
@@ -1,6 +1,6 @@
package org.apache.ibatis.cache.impl;
-import org.apache.ibatis.cache.BaseCache;
+import org.apache.ibatis.cache.impl.BaseCache;
import java.util.*;
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=692345&r1=692344&r2=692345&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
Thu Sep 4 23:19:54 2008
@@ -1,6 +1,6 @@
package org.apache.ibatis.cache.impl;
-import org.apache.ibatis.cache.BaseCache;
+import org.apache.ibatis.cache.impl.BaseCache;
import java.util.*;
Modified:
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/SoftCache.java
URL:
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/SoftCache.java?rev=692345&r1=692344&r2=692345&view=diff
==============================================================================
---
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/SoftCache.java
(original)
+++
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/SoftCache.java
Thu Sep 4 23:19:54 2008
@@ -1,6 +1,6 @@
package org.apache.ibatis.cache.impl;
-import org.apache.ibatis.cache.BaseCache;
+import org.apache.ibatis.cache.impl.BaseCache;
import javax.util.SoftHashMap;
import java.util.Map;
Modified:
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/WeakCache.java
URL:
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/WeakCache.java?rev=692345&r1=692344&r2=692345&view=diff
==============================================================================
---
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/WeakCache.java
(original)
+++
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/cache/impl/WeakCache.java
Thu Sep 4 23:19:54 2008
@@ -1,6 +1,6 @@
package org.apache.ibatis.cache.impl;
-import org.apache.ibatis.cache.BaseCache;
+import org.apache.ibatis.cache.impl.BaseCache;
import java.util.*;
Modified:
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/CachingExecutor.java
URL:
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/CachingExecutor.java?rev=692345&r1=692344&r2=692345&view=diff
==============================================================================
---
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/CachingExecutor.java
(original)
+++
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/CachingExecutor.java
Thu Sep 4 23:19:54 2008
@@ -11,9 +11,7 @@
public class CachingExecutor implements Executor {
private Executor delegate;
-
- private Set<Cache> clearCaches;
- private List<CacheEntry> cacheEntries;
+ private TransactionalCacheManager tcm = new TransactionalCacheManager();
public CachingExecutor(Executor delegate) {
this.delegate = delegate;
@@ -30,35 +28,32 @@
public int update(MappedStatement ms, Object parameterObject) throws
SQLException {
Cache cache = ms.getCache();
if (cache != null) {
- if (clearCaches == null) {
- clearCaches = new HashSet<Cache>();
- }
- clearCaches.add(cache);
+ tcm.clear(cache);
}
return delegate.update(ms, parameterObject);
}
+
public List query(MappedStatement ms, Object parameterObject, int offset,
int limit, ResultHandler resultHandler) throws SQLException {
if (ms != null) {
Cache cache = ms.getCache();
if (cache != null) {
- synchronized (cache) {
+ cache.getReadWriteLock().readLock().lock();
+ try {
CacheKey key = createCacheKey(ms, parameterObject, offset, limit);
if (cache.hasKey(key)) {
return (List) cache.getObject(key);
} else {
List list = delegate.query(ms, parameterObject, offset, limit,
resultHandler);
- if (cacheEntries == null) {
- cacheEntries = new ArrayList<CacheEntry>();
- }
- cacheEntries.add(new CacheEntry(cache, key, list));
+ tcm.putObject(cache, key, list);
return list;
}
+ } finally {
+ cache.getReadWriteLock().readLock().unlock();
}
}
}
return delegate.query(ms, parameterObject, offset, limit, resultHandler);
-
}
public List flushStatements() throws SQLException {
@@ -66,25 +61,16 @@
}
public void commit(boolean required) throws SQLException {
- if (clearCaches != null) {
- for (Cache cache : clearCaches) {
- cache.clear();
- }
- clearCaches.clear();
- }
- if (cacheEntries != null) {
- for (CacheEntry entry : cacheEntries) {
- entry.commit();
- }
- cacheEntries.clear();
- }
delegate.commit(required);
+ tcm.commit();
}
public void rollback(boolean required) throws SQLException {
- if (clearCaches != null) clearCaches.clear();
- if (cacheEntries != null) cacheEntries.clear();
- delegate.rollback(required);
+ try {
+ delegate.rollback(required);
+ } finally {
+ tcm.rollback();
+ }
}
public CacheKey createCacheKey(MappedStatement ms, Object parameterObject,
int offset, int limit) {
@@ -99,20 +85,4 @@
throw new UnsupportedOperationException("The CachingExecutor should not be
used by result loaders and thus deferLoad() should never be called.");
}
- private static class CacheEntry {
- private Cache cache;
- private CacheKey key;
- private Object value;
-
- public CacheEntry(Cache cache, CacheKey key, Object value) {
- this.cache = cache;
- this.key = key;
- this.value = value;
- }
-
- public void commit() {
- cache.putObject(key, value);
- }
- }
-
}
Modified:
ibatis/trunk/java/ibatis-3/ibatis-3-monarch/src/test/java/org/apache/ibatis/monarch/example/BlogMapper.xml
URL:
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-monarch/src/test/java/org/apache/ibatis/monarch/example/BlogMapper.xml?rev=692345&r1=692344&r2=692345&view=diff
==============================================================================
---
ibatis/trunk/java/ibatis-3/ibatis-3-monarch/src/test/java/org/apache/ibatis/monarch/example/BlogMapper.xml
(original)
+++
ibatis/trunk/java/ibatis-3/ibatis-3-monarch/src/test/java/org/apache/ibatis/monarch/example/BlogMapper.xml
Thu Sep 4 23:19:54 2008
@@ -1,6 +1,4 @@
-<mapper type="com.domain.PersonMapper">
-
- <defaultCache cacheType="MyLRU" cacheDomain="PersonMapper"/>
+<mapper type="com.domain.PersonMapper" cacheDomain="">
<resultMap id="" type="" extends="">
<constructor>
@@ -22,8 +20,7 @@
mode="" scale="" resultMap=""/>
</parameterMap>
- <select id="selectAllPeople" cacheType="" cacheDomain=""
- flushCache="" parameterType="" resultType="" resultMap="">
+ <select id="selectAllPeople" cacheDomain="" flushCache="" parameterType=""
resultType="" resultMap="">
select * from PERSON order by
${opts.order,javaType="",jdbcType="",typeHandler="",mode="",scale="",resultMap=""}
</select>
Modified:
ibatis/trunk/java/ibatis-3/ibatis-3-monarch/src/test/java/org/apache/ibatis/monarch/example/MapperConfig.xml
URL:
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-monarch/src/test/java/org/apache/ibatis/monarch/example/MapperConfig.xml?rev=692345&r1=692344&r2=692345&view=diff
==============================================================================
---
ibatis/trunk/java/ibatis-3/ibatis-3-monarch/src/test/java/org/apache/ibatis/monarch/example/MapperConfig.xml
(original)
+++
ibatis/trunk/java/ibatis-3/ibatis-3-monarch/src/test/java/org/apache/ibatis/monarch/example/MapperConfig.xml
Thu Sep 4 23:19:54 2008
@@ -20,11 +20,9 @@
<setting name="" value=""/>
</settings>
- <caches default="MyLRU">
- <cache id="myLRU" type="LRU">
- <properties name="" value=""/>
- </cache>
- </caches>
+ <cache type="LRU">
+ <properties name="" value=""/>
+ </cache>
<environments default="development">
<environment id="development">