add a layer of caching for directory props.

This commit is contained in:
Knut Forkalsrud 2010-05-22 12:32:00 -07:00
parent 6dd333992e
commit fdc1f4deea

View file

@ -7,6 +7,8 @@ import java.io.IOException;
import java.io.StringReader; import java.io.StringReader;
import java.io.StringWriter; import java.io.StringWriter;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.util.LinkedHashMap;
import java.util.Map;
import com.sleepycat.bind.tuple.TupleBinding; import com.sleepycat.bind.tuple.TupleBinding;
import com.sleepycat.bind.tuple.TupleInput; import com.sleepycat.bind.tuple.TupleInput;
@ -28,6 +30,13 @@ public class DirectoryDatabase extends TupleBinding<DirectoryProps> {
private Environment environment; private Environment environment;
private Database db; private Database db;
private LinkedHashMap<String, DirectoryProps> cache = new LinkedHashMap<String, DirectoryProps>() {
@Override
public boolean removeEldestEntry(Map.Entry<String, DirectoryProps> entry) {
return size() >= 200;
}
};
public DirectoryDatabase(Environment environment) { public DirectoryDatabase(Environment environment) {
@ -50,6 +59,15 @@ public class DirectoryDatabase extends TupleBinding<DirectoryProps> {
return db.count(); return db.count();
} }
public synchronized DirectoryProps get(String key) {
DirectoryProps props = cache.get(key);
if (props == null) {
props = load(key);
cache.put(key, props);
}
return props;
}
public DirectoryProps load(String key) { public DirectoryProps load(String key) {
DatabaseEntry data = new DatabaseEntry(); DatabaseEntry data = new DatabaseEntry();
@ -63,7 +81,7 @@ public class DirectoryDatabase extends TupleBinding<DirectoryProps> {
} }
} }
public void store(String key, DirectoryProps img) { public synchronized void store(String key, DirectoryProps img) {
DatabaseEntry data = new DatabaseEntry(); DatabaseEntry data = new DatabaseEntry();
objectToEntry(img, data); objectToEntry(img, data);
@ -71,6 +89,7 @@ public class DirectoryDatabase extends TupleBinding<DirectoryProps> {
Transaction txn = environment.beginTransaction(null, null); Transaction txn = environment.beginTransaction(null, null);
db.delete(txn, binKey); db.delete(txn, binKey);
db.put(txn, binKey, data); db.put(txn, binKey, data);
cache.remove(key);
txn.commitSync(); txn.commitSync();
} }