Skip to content

Commit ddc48a7

Browse files
committed
Fixes #159. Remove external cache locking.
1 parent 869f951 commit ddc48a7

16 files changed

+166
-110
lines changed

src/main/java/org/apache/ibatis/cache/Cache.java

+52-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2009-2012 the original author or authors.
2+
* Copyright 2009-2014 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -17,20 +17,71 @@
1717

1818
import java.util.concurrent.locks.ReadWriteLock;
1919

20+
/**
21+
* Interface to be implemented by cache providers.
22+
*
23+
* One instance of cache will be created for each namespace.
24+
*
25+
* The cache implementation must have a constructor that receives the cache id as an String parameter.
26+
*
27+
* <pre>
28+
* public MyCache(final String id) {
29+
* if (id == null) {
30+
* throw new IllegalArgumentException("Cache instances require an ID");
31+
* }
32+
* this.id = id;
33+
* initialize();
34+
* }
35+
* </pre>
36+
*
37+
*/
38+
2039
public interface Cache {
2140

41+
/**
42+
* @return The identifier of this cache
43+
*/
2244
String getId();
2345

46+
/**
47+
* Optional. It is not called by the core.
48+
*
49+
* @return The cache size.
50+
*/
2451
int getSize();
2552

53+
/**
54+
* @param key Can be any object but usually it is a {@link CacheKey}
55+
* @param value The result of a select.
56+
*/
2657
void putObject(Object key, Object value);
2758

59+
/**
60+
* @param key The key
61+
* @return The object stored in the cache.
62+
*/
2863
Object getObject(Object key);
2964

65+
/**
66+
* Optional. It is not called by the core.
67+
*
68+
* @param key The key
69+
* @return The object that was removed
70+
*/
3071
Object removeObject(Object key);
3172

73+
/**
74+
* Clears this cache instance
75+
*/
3276
void clear();
3377

78+
/**
79+
* As of 3.2.6 this method is no longer called by the core.
80+
* Any locking needed by the cache must be provided internally by the cache provider.
81+
*
82+
* @return A ReadWriteLock
83+
* @deprecated
84+
*/
3485
ReadWriteLock getReadWriteLock();
3586

3687
}

src/main/java/org/apache/ibatis/cache/decorators/FifoCache.java

+10-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2009-2012 the original author or authors.
2+
* Copyright 2009-2014 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -35,10 +35,12 @@ public FifoCache(Cache delegate) {
3535
this.size = 1024;
3636
}
3737

38+
@Override
3839
public String getId() {
3940
return delegate.getId();
4041
}
4142

43+
@Override
4244
public int getSize() {
4345
return delegate.getSize();
4446
}
@@ -47,26 +49,31 @@ public void setSize(int size) {
4749
this.size = size;
4850
}
4951

52+
@Override
5053
public void putObject(Object key, Object value) {
5154
cycleKeyList(key);
5255
delegate.putObject(key, value);
5356
}
5457

58+
@Override
5559
public Object getObject(Object key) {
5660
return delegate.getObject(key);
5761
}
5862

63+
@Override
5964
public Object removeObject(Object key) {
6065
return delegate.removeObject(key);
6166
}
6267

68+
@Override
6369
public void clear() {
6470
delegate.clear();
65-
keyList = new LinkedList<Object>(); // see #138
71+
keyList.clear();
6672
}
6773

74+
@Override
6875
public ReadWriteLock getReadWriteLock() {
69-
return delegate.getReadWriteLock();
76+
return null;
7077
}
7178

7279
private void cycleKeyList(Object key) {

src/main/java/org/apache/ibatis/cache/decorators/LoggingCache.java

+12-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2009-2012 the original author or authors.
2+
* Copyright 2009-2014 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -23,7 +23,7 @@
2323

2424
public class LoggingCache implements Cache {
2525

26-
private static final Log log = LogFactory.getLog(LoggingCache.class);
26+
private static final Log log = LogFactory.getLog(LoggingCache.class);
2727

2828
private Cache delegate;
2929
protected int requests = 0;
@@ -33,18 +33,22 @@ public LoggingCache(Cache delegate) {
3333
this.delegate = delegate;
3434
}
3535

36+
@Override
3637
public String getId() {
3738
return delegate.getId();
3839
}
3940

41+
@Override
4042
public int getSize() {
4143
return delegate.getSize();
4244
}
4345

46+
@Override
4447
public void putObject(Object key, Object object) {
4548
delegate.putObject(key, object);
4649
}
4750

51+
@Override
4852
public Object getObject(Object key) {
4953
requests++;
5054
final Object value = delegate.getObject(key);
@@ -57,22 +61,27 @@ public Object getObject(Object key) {
5761
return value;
5862
}
5963

64+
@Override
6065
public Object removeObject(Object key) {
6166
return delegate.removeObject(key);
6267
}
6368

69+
@Override
6470
public void clear() {
6571
delegate.clear();
6672
}
6773

74+
@Override
6875
public ReadWriteLock getReadWriteLock() {
69-
return delegate.getReadWriteLock();
76+
return null;
7077
}
7178

79+
@Override
7280
public int hashCode() {
7381
return delegate.hashCode();
7482
}
7583

84+
@Override
7685
public boolean equals(Object obj) {
7786
return delegate.equals(obj);
7887
}

src/main/java/org/apache/ibatis/cache/decorators/LruCache.java

+10-8
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2009-2012 the original author or authors.
2+
* Copyright 2009-2014 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -15,7 +15,6 @@
1515
*/
1616
package org.apache.ibatis.cache.decorators;
1717

18-
import java.util.Collections;
1918
import java.util.LinkedHashMap;
2019
import java.util.Map;
2120
import java.util.concurrent.locks.ReadWriteLock;
@@ -36,17 +35,18 @@ public LruCache(Cache delegate) {
3635
setSize(1024);
3736
}
3837

38+
@Override
3939
public String getId() {
4040
return delegate.getId();
4141
}
4242

43+
@Override
4344
public int getSize() {
4445
return delegate.getSize();
4546
}
4647

4748
public void setSize(final int size) {
48-
// TODO look for a better solution to this, see issue #335
49-
keyMap = Collections.synchronizedMap(new LinkedHashMap<Object, Object>(size, .75F, true) {
49+
keyMap = new LinkedHashMap<Object, Object>(size, .75F, true) {
5050
private static final long serialVersionUID = 4267176411845948333L;
5151

5252
protected boolean removeEldestEntry(Map.Entry<Object, Object> eldest) {
@@ -56,31 +56,34 @@ protected boolean removeEldestEntry(Map.Entry<Object, Object> eldest) {
5656
}
5757
return tooBig;
5858
}
59-
});
59+
};
6060
}
6161

62+
@Override
6263
public void putObject(Object key, Object value) {
6364
delegate.putObject(key, value);
6465
cycleKeyList(key);
6566
}
6667

68+
@Override
6769
public Object getObject(Object key) {
6870
keyMap.get(key); //touch
6971
return delegate.getObject(key);
70-
7172
}
7273

74+
@Override
7375
public Object removeObject(Object key) {
7476
return delegate.removeObject(key);
7577
}
7678

79+
@Override
7780
public void clear() {
7881
delegate.clear();
7982
keyMap.clear();
8083
}
8184

8285
public ReadWriteLock getReadWriteLock() {
83-
return delegate.getReadWriteLock();
86+
return null;
8487
}
8588

8689
private void cycleKeyList(Object key) {
@@ -92,4 +95,3 @@ private void cycleKeyList(Object key) {
9295
}
9396

9497
}
95-

src/main/java/org/apache/ibatis/cache/decorators/ScheduledCache.java

+11-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2009-2012 the original author or authors.
2+
* Copyright 2009-2014 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -35,20 +35,24 @@ public void setClearInterval(long clearInterval) {
3535
this.clearInterval = clearInterval;
3636
}
3737

38+
@Override
3839
public String getId() {
3940
return delegate.getId();
4041
}
4142

43+
@Override
4244
public int getSize() {
4345
clearWhenStale();
4446
return delegate.getSize();
4547
}
4648

49+
@Override
4750
public void putObject(Object key, Object object) {
4851
clearWhenStale();
4952
delegate.putObject(key, object);
5053
}
5154

55+
@Override
5256
public Object getObject(Object key) {
5357
if (clearWhenStale()) {
5458
return null;
@@ -57,24 +61,29 @@ public Object getObject(Object key) {
5761
}
5862
}
5963

64+
@Override
6065
public Object removeObject(Object key) {
6166
clearWhenStale();
6267
return delegate.removeObject(key);
6368
}
6469

70+
@Override
6571
public void clear() {
6672
lastClear = System.currentTimeMillis();
6773
delegate.clear();
6874
}
6975

76+
@Override
7077
public ReadWriteLock getReadWriteLock() {
71-
return delegate.getReadWriteLock();
78+
return null;
7279
}
7380

81+
@Override
7482
public int hashCode() {
7583
return delegate.hashCode();
7684
}
7785

86+
@Override
7887
public boolean equals(Object obj) {
7988
return delegate.equals(obj);
8089
}

0 commit comments

Comments
 (0)