diff --git a/src/main/java/org/forkalsrud/album/db/DirectoryDatabase.java b/src/main/java/org/forkalsrud/album/db/DirectoryDatabase.java index af631d8..136e140 100644 --- a/src/main/java/org/forkalsrud/album/db/DirectoryDatabase.java +++ b/src/main/java/org/forkalsrud/album/db/DirectoryDatabase.java @@ -7,6 +7,8 @@ import java.io.IOException; import java.io.StringReader; import java.io.StringWriter; import java.nio.charset.Charset; +import java.util.LinkedHashMap; +import java.util.Map; import com.sleepycat.bind.tuple.TupleBinding; import com.sleepycat.bind.tuple.TupleInput; @@ -28,6 +30,13 @@ public class DirectoryDatabase extends TupleBinding { private Environment environment; private Database db; + private LinkedHashMap cache = new LinkedHashMap() { + + @Override + public boolean removeEldestEntry(Map.Entry entry) { + return size() >= 200; + } + }; public DirectoryDatabase(Environment environment) { @@ -50,6 +59,15 @@ public class DirectoryDatabase extends TupleBinding { 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) { DatabaseEntry data = new DatabaseEntry(); @@ -63,7 +81,7 @@ public class DirectoryDatabase extends TupleBinding { } } - public void store(String key, DirectoryProps img) { + public synchronized void store(String key, DirectoryProps img) { DatabaseEntry data = new DatabaseEntry(); objectToEntry(img, data); @@ -71,6 +89,7 @@ public class DirectoryDatabase extends TupleBinding { Transaction txn = environment.beginTransaction(null, null); db.delete(txn, binKey); db.put(txn, binKey, data); + cache.remove(key); txn.commitSync(); }