相关疑难解决方法(0)

我使用番石榴的理想缓存

过去几周我一直在尝试使用guava的MapMaker找到理想的缓存实现.请在此处此处查看我之前的两个问题,以了解我的思考过程.

根据我所学到的,我的下一次尝试将放弃软值,转而使用maximumSize和expireAfterAccess:

ConcurrentMap<String, MyObject> cache = new MapMaker()
        .maximumSize(MAXIMUM_SIZE)
        .expireAfterAccess(MINUTES_TO_EXPIRY, TimeUnit.MINUTES)
        .makeComputingMap(loadFunction);
Run Code Online (Sandbox Code Playgroud)

哪里

Function<String, MyObject> loadFunction = new Function<String, MyObject>() {
   @Override
   public MyObject apply(String uidKey) {
      return getFromDataBase(uidKey);
   }
};
Run Code Online (Sandbox Code Playgroud)

但是,我仍在努力解决的另一个问题是,即使它们的时间很长,这个实现也会驱逐对象,即使它们是强烈可达的.这可能会导致多个对象在环境中浮动相同的UID,这是我不想要的(我相信我想要实现的目标称为规范化).

所以,据我所知,唯一的答案是有一个额外的映射作为一个interner我可以检查,看看数据对象是否仍在内存中:

ConcurrentMap<String, MyObject> interner = new MapMaker()
        .weakValues()
        .makeMap();
Run Code Online (Sandbox Code Playgroud)

并且将修改加载函数:

Function<String, MyObject> loadFunction = new Function<String, MyObject>() {
   @Override
   public MyObject apply(String uidKey) {
      MyObject dataObject = interner.get(uidKey);
      if (dataObject == null) {
         dataObject = getFromDataBase(uidKey);
         interner.put(uidKey, dataObject);
      }
      return dataObject;
   } …
Run Code Online (Sandbox Code Playgroud)

java caching canonicalization guava

20
推荐指数
1
解决办法
3163
查看次数

如何在Java中实现规范化映射?

我目前正在编写自己的小ORM,并发现自己面临着创建规范化映射的任务,以防止从数据库中多次加载同一个实体.

我目前的做法是使用a HashMap<Object, WeakReference<Object>>.密钥是映射的数据库实体的主键(ArrayList<Object>如果它是复合键),则值为WeakReference<Object>.

我的主要问题是如何清理地图?当一个对象不再使用时,地图中的弱引用将会出现null,我只会在下一次查找时发现这一点(或者,如果我不再查看该对象,则永远不会发现).ReferenceQueue当它们被清除时,我可以使弱引用注册为a ,然后每次查看时检查该队列.清除的引用不会给我任何关于哪个对象被清除的提示,所以我想我必须子类WeakReference将该键存储在地图中,所以我可以在清除引用后将其删除.

这是要走的路,还是有更简单的方法来实现它?

java orm weak-references canonicalization

10
推荐指数
1
解决办法
5404
查看次数

使用软引用有什么"实际后果"?

根据番石榴的文档MapMaker.softValues():

警告:在大多数情况下,最好设置每缓存最大大小而不是使用软引用.如果您熟悉软引用的实际后果,则应该只使用此方法.

我对软引用有一个中间的理解 - 它们的行为,用途以及它们与垃圾收集的契约.但是我想知道这些实际后果是由博士提到的.为什么使用最大尺寸而不是软参考更好?在实现缓存方面,软引用的算法和行为是否使得它们的使用比硬编码上限更有效?

java caching garbage-collection soft-references

6
推荐指数
1
解决办法
775
查看次数