diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index a0700b2..db9627b 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -359,12 +359,14 @@ MetaData meta = MetaDataHandler.get().getMetaData(collectionClass); ReferentList list = new ReferentList(collectionClass, meta); - ByteBuffer buffer = ByteBuffer.wrap(Util.readInputStream(in)); + if (in != null) { + ByteBuffer buffer = ByteBuffer.wrap(Util.readInputStream(in)); - while(buffer.hasRemaining()) { - id = buffer.getLong(); + while(buffer.hasRemaining()) { + id = buffer.getLong(); - list.addId(id); + list.addId(id); + } } set(obj, list); diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index a0700b2..db9627b 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -359,12 +359,14 @@ MetaData meta = MetaDataHandler.get().getMetaData(collectionClass); ReferentList list = new ReferentList(collectionClass, meta); - ByteBuffer buffer = ByteBuffer.wrap(Util.readInputStream(in)); + if (in != null) { + ByteBuffer buffer = ByteBuffer.wrap(Util.readInputStream(in)); - while(buffer.hasRemaining()) { - id = buffer.getLong(); + while(buffer.hasRemaining()) { + id = buffer.getLong(); - list.addId(id); + list.addId(id); + } } set(obj, list); diff --git a/src/nl/astraeus/database/MetaData.java b/src/nl/astraeus/database/MetaData.java index b52912b..d274ae6 100644 --- a/src/nl/astraeus/database/MetaData.java +++ b/src/nl/astraeus/database/MetaData.java @@ -48,7 +48,6 @@ if (cache != null) { nl.astraeus.database.cache.Cache.get().setMaxSize(cls, cache.maxSize()); - nl.astraeus.database.cache.Cache.get().setMaxAge(cls, cache.maxAge()); } Field [] fields = cls.getDeclaredFields(); diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index a0700b2..db9627b 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -359,12 +359,14 @@ MetaData meta = MetaDataHandler.get().getMetaData(collectionClass); ReferentList list = new ReferentList(collectionClass, meta); - ByteBuffer buffer = ByteBuffer.wrap(Util.readInputStream(in)); + if (in != null) { + ByteBuffer buffer = ByteBuffer.wrap(Util.readInputStream(in)); - while(buffer.hasRemaining()) { - id = buffer.getLong(); + while(buffer.hasRemaining()) { + id = buffer.getLong(); - list.addId(id); + list.addId(id); + } } set(obj, list); diff --git a/src/nl/astraeus/database/MetaData.java b/src/nl/astraeus/database/MetaData.java index b52912b..d274ae6 100644 --- a/src/nl/astraeus/database/MetaData.java +++ b/src/nl/astraeus/database/MetaData.java @@ -48,7 +48,6 @@ if (cache != null) { nl.astraeus.database.cache.Cache.get().setMaxSize(cls, cache.maxSize()); - nl.astraeus.database.cache.Cache.get().setMaxAge(cls, cache.maxAge()); } Field [] fields = cls.getDeclaredFields(); diff --git a/src/nl/astraeus/database/annotations/Cache.java b/src/nl/astraeus/database/annotations/Cache.java index 146e2e0..924b302 100644 --- a/src/nl/astraeus/database/annotations/Cache.java +++ b/src/nl/astraeus/database/annotations/Cache.java @@ -11,7 +11,6 @@ @Retention(RetentionPolicy.RUNTIME) public @interface Cache { - int maxSize() default 100; - long maxAge() default 0; + int maxSize() default 1000; } diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index a0700b2..db9627b 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -359,12 +359,14 @@ MetaData meta = MetaDataHandler.get().getMetaData(collectionClass); ReferentList list = new ReferentList(collectionClass, meta); - ByteBuffer buffer = ByteBuffer.wrap(Util.readInputStream(in)); + if (in != null) { + ByteBuffer buffer = ByteBuffer.wrap(Util.readInputStream(in)); - while(buffer.hasRemaining()) { - id = buffer.getLong(); + while(buffer.hasRemaining()) { + id = buffer.getLong(); - list.addId(id); + list.addId(id); + } } set(obj, list); diff --git a/src/nl/astraeus/database/MetaData.java b/src/nl/astraeus/database/MetaData.java index b52912b..d274ae6 100644 --- a/src/nl/astraeus/database/MetaData.java +++ b/src/nl/astraeus/database/MetaData.java @@ -48,7 +48,6 @@ if (cache != null) { nl.astraeus.database.cache.Cache.get().setMaxSize(cls, cache.maxSize()); - nl.astraeus.database.cache.Cache.get().setMaxAge(cls, cache.maxAge()); } Field [] fields = cls.getDeclaredFields(); diff --git a/src/nl/astraeus/database/annotations/Cache.java b/src/nl/astraeus/database/annotations/Cache.java index 146e2e0..924b302 100644 --- a/src/nl/astraeus/database/annotations/Cache.java +++ b/src/nl/astraeus/database/annotations/Cache.java @@ -11,7 +11,6 @@ @Retention(RetentionPolicy.RUNTIME) public @interface Cache { - int maxSize() default 100; - long maxAge() default 0; + int maxSize() default 1000; } diff --git a/src/nl/astraeus/database/cache/Cache.java b/src/nl/astraeus/database/cache/Cache.java index 247d074..4822347 100644 --- a/src/nl/astraeus/database/cache/Cache.java +++ b/src/nl/astraeus/database/cache/Cache.java @@ -25,11 +25,22 @@ return getObjectCache(cls).getObject(id); } + protected ObjectCache createCache(Class cls) { + int maxSize = Integer.MAX_VALUE; + + nl.astraeus.database.annotations.Cache cacheAnnotation = cls.getAnnotation(nl.astraeus.database.annotations.Cache.class); + if (cacheAnnotation != null) { + maxSize = cacheAnnotation.maxSize(); + } + + return new ObjectCache(maxSize); + } + public void set(Class cls, Long id, T object) { ObjectCache objectCache = (ObjectCache) cache.get(cls); if (objectCache == null) { - objectCache = new ObjectCache(); + objectCache = createCache(cls); cache.put(cls, objectCache); } @@ -41,7 +52,7 @@ ObjectCache objectCache = (ObjectCache) cache.get(cls); if (objectCache == null) { - objectCache = new ObjectCache(); + objectCache = createCache(cls); cache.put(cls, objectCache); } @@ -53,10 +64,6 @@ getObjectCache(cls).setMaxSize(maxSize); } - public void setMaxAge(Class cls, long maxAge) { - getObjectCache(cls).setMaxAge(maxAge); - } - public void clear() { cache.clear(); } diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index a0700b2..db9627b 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -359,12 +359,14 @@ MetaData meta = MetaDataHandler.get().getMetaData(collectionClass); ReferentList list = new ReferentList(collectionClass, meta); - ByteBuffer buffer = ByteBuffer.wrap(Util.readInputStream(in)); + if (in != null) { + ByteBuffer buffer = ByteBuffer.wrap(Util.readInputStream(in)); - while(buffer.hasRemaining()) { - id = buffer.getLong(); + while(buffer.hasRemaining()) { + id = buffer.getLong(); - list.addId(id); + list.addId(id); + } } set(obj, list); diff --git a/src/nl/astraeus/database/MetaData.java b/src/nl/astraeus/database/MetaData.java index b52912b..d274ae6 100644 --- a/src/nl/astraeus/database/MetaData.java +++ b/src/nl/astraeus/database/MetaData.java @@ -48,7 +48,6 @@ if (cache != null) { nl.astraeus.database.cache.Cache.get().setMaxSize(cls, cache.maxSize()); - nl.astraeus.database.cache.Cache.get().setMaxAge(cls, cache.maxAge()); } Field [] fields = cls.getDeclaredFields(); diff --git a/src/nl/astraeus/database/annotations/Cache.java b/src/nl/astraeus/database/annotations/Cache.java index 146e2e0..924b302 100644 --- a/src/nl/astraeus/database/annotations/Cache.java +++ b/src/nl/astraeus/database/annotations/Cache.java @@ -11,7 +11,6 @@ @Retention(RetentionPolicy.RUNTIME) public @interface Cache { - int maxSize() default 100; - long maxAge() default 0; + int maxSize() default 1000; } diff --git a/src/nl/astraeus/database/cache/Cache.java b/src/nl/astraeus/database/cache/Cache.java index 247d074..4822347 100644 --- a/src/nl/astraeus/database/cache/Cache.java +++ b/src/nl/astraeus/database/cache/Cache.java @@ -25,11 +25,22 @@ return getObjectCache(cls).getObject(id); } + protected ObjectCache createCache(Class cls) { + int maxSize = Integer.MAX_VALUE; + + nl.astraeus.database.annotations.Cache cacheAnnotation = cls.getAnnotation(nl.astraeus.database.annotations.Cache.class); + if (cacheAnnotation != null) { + maxSize = cacheAnnotation.maxSize(); + } + + return new ObjectCache(maxSize); + } + public void set(Class cls, Long id, T object) { ObjectCache objectCache = (ObjectCache) cache.get(cls); if (objectCache == null) { - objectCache = new ObjectCache(); + objectCache = createCache(cls); cache.put(cls, objectCache); } @@ -41,7 +52,7 @@ ObjectCache objectCache = (ObjectCache) cache.get(cls); if (objectCache == null) { - objectCache = new ObjectCache(); + objectCache = createCache(cls); cache.put(cls, objectCache); } @@ -53,10 +64,6 @@ getObjectCache(cls).setMaxSize(maxSize); } - public void setMaxAge(Class cls, long maxAge) { - getObjectCache(cls).setMaxAge(maxAge); - } - public void clear() { cache.clear(); } diff --git a/src/nl/astraeus/database/cache/ObjectCache.java b/src/nl/astraeus/database/cache/ObjectCache.java index d30d1c9..b232c29 100644 --- a/src/nl/astraeus/database/cache/ObjectCache.java +++ b/src/nl/astraeus/database/cache/ObjectCache.java @@ -1,7 +1,7 @@ package nl.astraeus.database.cache; +import java.util.LinkedHashMap; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; /** * Date: 11/16/13 @@ -9,19 +9,22 @@ */ public class ObjectCache { - private Map> cache = new ConcurrentHashMap<>(); + private LinkedHashMap> cache = new LinkedHashMap>(1000, 0.75f, true) { + @Override + protected boolean removeEldestEntry(Map.Entry> eldest) { + return size() > ObjectCache.this.getMaxSize(); + } + }; - private int maxSize = 500; - private long maxAge = 250; + private int maxSize; + + public ObjectCache(int maxSize) { + this.maxSize = maxSize; + } protected boolean inCache(Long id) { ObjectReference ref = cache.get(id); - if (maxAge > 0 && ref != null && ref.getLastAccessTime() < System.currentTimeMillis() - maxAge) { - ref = null; - cache.remove(id); - } - return ref != null; } @@ -29,11 +32,6 @@ T result = null; ObjectReference ref = cache.get(id); - if (maxAge > 0 && ref.getLastAccessTime() < System.currentTimeMillis() - maxAge) { - ref = null; - cache.remove(id); - } - if (ref != null) { result = ref.get(); } @@ -51,20 +49,6 @@ } else { ref.set(object); } - - if (cache.size() > maxSize) { - ObjectReference delete = null; - - for (ObjectReference objRef : cache.values()) { - if (delete == null || delete.getLastAccessTime() > objRef.getLastAccessTime()) { - delete = objRef; - } - } - - if (delete != null) { - cache.remove(delete.getId()); - } - } } public int getNumberCached() { @@ -75,7 +59,7 @@ this.maxSize = maxSize; } - public void setMaxAge(long maxAge) { - this.maxAge = maxAge; + public int getMaxSize() { + return maxSize; } } diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index a0700b2..db9627b 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -359,12 +359,14 @@ MetaData meta = MetaDataHandler.get().getMetaData(collectionClass); ReferentList list = new ReferentList(collectionClass, meta); - ByteBuffer buffer = ByteBuffer.wrap(Util.readInputStream(in)); + if (in != null) { + ByteBuffer buffer = ByteBuffer.wrap(Util.readInputStream(in)); - while(buffer.hasRemaining()) { - id = buffer.getLong(); + while(buffer.hasRemaining()) { + id = buffer.getLong(); - list.addId(id); + list.addId(id); + } } set(obj, list); diff --git a/src/nl/astraeus/database/MetaData.java b/src/nl/astraeus/database/MetaData.java index b52912b..d274ae6 100644 --- a/src/nl/astraeus/database/MetaData.java +++ b/src/nl/astraeus/database/MetaData.java @@ -48,7 +48,6 @@ if (cache != null) { nl.astraeus.database.cache.Cache.get().setMaxSize(cls, cache.maxSize()); - nl.astraeus.database.cache.Cache.get().setMaxAge(cls, cache.maxAge()); } Field [] fields = cls.getDeclaredFields(); diff --git a/src/nl/astraeus/database/annotations/Cache.java b/src/nl/astraeus/database/annotations/Cache.java index 146e2e0..924b302 100644 --- a/src/nl/astraeus/database/annotations/Cache.java +++ b/src/nl/astraeus/database/annotations/Cache.java @@ -11,7 +11,6 @@ @Retention(RetentionPolicy.RUNTIME) public @interface Cache { - int maxSize() default 100; - long maxAge() default 0; + int maxSize() default 1000; } diff --git a/src/nl/astraeus/database/cache/Cache.java b/src/nl/astraeus/database/cache/Cache.java index 247d074..4822347 100644 --- a/src/nl/astraeus/database/cache/Cache.java +++ b/src/nl/astraeus/database/cache/Cache.java @@ -25,11 +25,22 @@ return getObjectCache(cls).getObject(id); } + protected ObjectCache createCache(Class cls) { + int maxSize = Integer.MAX_VALUE; + + nl.astraeus.database.annotations.Cache cacheAnnotation = cls.getAnnotation(nl.astraeus.database.annotations.Cache.class); + if (cacheAnnotation != null) { + maxSize = cacheAnnotation.maxSize(); + } + + return new ObjectCache(maxSize); + } + public void set(Class cls, Long id, T object) { ObjectCache objectCache = (ObjectCache) cache.get(cls); if (objectCache == null) { - objectCache = new ObjectCache(); + objectCache = createCache(cls); cache.put(cls, objectCache); } @@ -41,7 +52,7 @@ ObjectCache objectCache = (ObjectCache) cache.get(cls); if (objectCache == null) { - objectCache = new ObjectCache(); + objectCache = createCache(cls); cache.put(cls, objectCache); } @@ -53,10 +64,6 @@ getObjectCache(cls).setMaxSize(maxSize); } - public void setMaxAge(Class cls, long maxAge) { - getObjectCache(cls).setMaxAge(maxAge); - } - public void clear() { cache.clear(); } diff --git a/src/nl/astraeus/database/cache/ObjectCache.java b/src/nl/astraeus/database/cache/ObjectCache.java index d30d1c9..b232c29 100644 --- a/src/nl/astraeus/database/cache/ObjectCache.java +++ b/src/nl/astraeus/database/cache/ObjectCache.java @@ -1,7 +1,7 @@ package nl.astraeus.database.cache; +import java.util.LinkedHashMap; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; /** * Date: 11/16/13 @@ -9,19 +9,22 @@ */ public class ObjectCache { - private Map> cache = new ConcurrentHashMap<>(); + private LinkedHashMap> cache = new LinkedHashMap>(1000, 0.75f, true) { + @Override + protected boolean removeEldestEntry(Map.Entry> eldest) { + return size() > ObjectCache.this.getMaxSize(); + } + }; - private int maxSize = 500; - private long maxAge = 250; + private int maxSize; + + public ObjectCache(int maxSize) { + this.maxSize = maxSize; + } protected boolean inCache(Long id) { ObjectReference ref = cache.get(id); - if (maxAge > 0 && ref != null && ref.getLastAccessTime() < System.currentTimeMillis() - maxAge) { - ref = null; - cache.remove(id); - } - return ref != null; } @@ -29,11 +32,6 @@ T result = null; ObjectReference ref = cache.get(id); - if (maxAge > 0 && ref.getLastAccessTime() < System.currentTimeMillis() - maxAge) { - ref = null; - cache.remove(id); - } - if (ref != null) { result = ref.get(); } @@ -51,20 +49,6 @@ } else { ref.set(object); } - - if (cache.size() > maxSize) { - ObjectReference delete = null; - - for (ObjectReference objRef : cache.values()) { - if (delete == null || delete.getLastAccessTime() > objRef.getLastAccessTime()) { - delete = objRef; - } - } - - if (delete != null) { - cache.remove(delete.getId()); - } - } } public int getNumberCached() { @@ -75,7 +59,7 @@ this.maxSize = maxSize; } - public void setMaxAge(long maxAge) { - this.maxAge = maxAge; + public int getMaxSize() { + return maxSize; } } diff --git a/test/nl/astraeus/database/test/model/Person.java b/test/nl/astraeus/database/test/model/Person.java index bed9aeb..aa5a41d 100644 --- a/test/nl/astraeus/database/test/model/Person.java +++ b/test/nl/astraeus/database/test/model/Person.java @@ -10,7 +10,7 @@ */ @Ignore @Table(name="persons") -@Cache(maxSize = 6, maxAge = 1000 * 60 * 60) +@Cache(maxSize = 6) public class Person { @Id