【问题标题】:Java:How can I populate map if I use callables?Java:如果我使用可调用对象,如何填充地图?
【发布时间】:2012-02-10 10:18:46
【问题描述】:

我想在我的应用程序中使用Map 作为小型数据库“缓存”的一种形式。
我认为最好使用类似的东西:

ConcurrentHashMap<K,Callable<V>>

这样我就可以为多种数据库对象提供一个缓存(而不是每种数据库对象都有一个缓存,即`ConcurrentHashMap<K,V>,其中V 是某个特定对象)。

我现在的问题(假设上述所有想法都是合理的)是如何在从数据库启动时预加载此缓存?

我的意思是,如果我需要缓存中的某些东西并且不存在可调用对象,那么可调用对象将第一次得到它并在下一个get 中准备好它。

但是,如果我使用可调用对象,如何预加载缓存?

注意:我对使用某些库不感兴趣,因为我的需求很小。

【问题讨论】:

  • 我真的不明白你打算如何在这里使用可调用对象。 Callable 只是一个接口;您将如何实施?
  • 我将使用Callable 作为值,如果key 不在缓存中,callable 将执行 sql 查询以第一次获取它。下一个查询将成功

标签: java database multithreading concurrency map


【解决方案1】:

可能ConcurrentHashMap<K, Future<V>> 有更好的运气,因为Future 更符合“正在计算的过程中,或者可能已经计算的东西”的概念。您可以使用已计算的 Future 初始化缓存的一些元素。

【讨论】:

    【解决方案2】:

    你就不能做一些像这样简单的事情吗?

    for (Callable<V> c : map.values()) {
        c.call();
    }
    

    【讨论】:

    • 不,因为我不知道密钥。我必须使用可调用的密钥来查询数据库
    • 如果您有密钥,您将如何将其传递给可调用对象?
    【解决方案3】:

    您可能应该在对象上使用接口:

    public interface Cacheable{}
    
    public MyObject implements Cacheable{...}
    
    ConcurrentHashMap<K, Cacheable> = ...
    

    【讨论】:

    • 不确定这有什么帮助。我会使用 Callable 作为值,如果键不在缓存中,则 callable 将执行 sql 查询以第一次获取它。下一个查询将成功。
    • @Jim,我真的不明白你在做什么 - Callable 是一个接口,你能提供一个如何使用它的例子吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-09
    • 2018-04-06
    • 1970-01-01
    • 2016-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多