代码之家  ›  专栏  ›  技术社区  ›  m_vitaly

JavaEE应用中的缓存技术

  •  1
  • m_vitaly  · 技术社区  · 16 年前

    我使用JBoss作为。我有一个长而重的SQL在应用服务器中运行。我想基于输入参数缓存结果。

    我有几个选择:

    1. 使用缓存管理器并手动将结果放入缓存。

    2. 使用带有加载程序的缓存管理器,当缓存中没有结果时,加载程序会将结果“加载”到缓存中。

    我现在不关心将缓存复制到集群中的其他服务器。

    我的问题是我应该选择什么选项?每个选项的优点和缺点是什么?(易于部署,配置混乱)

    这是否可以使用jboss缓存或ehcache或两者同时实现?


    更新: 我正在使用Hibernate,但结果不是实体,而是计数器。我需要计算属于特定类别并具有特定状态的所有行。我希望缓存该结果。

    我应该将结果包装在实体中吗?那么,我怎样才能使它像(物化的)一样工作呢?在Oracle中查看-自动更新或通过触发器更新。

    4 回复  |  直到 11 年前
        1
  •  3
  •   chepseskaf Nick Holt    12 年前

    你必须把数据从 ResultSet 进入 物体 为了缓存它,为什么不开始使用Hibernate呢?Hibernate提供了多种缓存选项,包括ehcache、jboss缓存和一个简单的映射。

    http://docs.jboss.org/hibernate/core/4.1/manual/en-US/html/ch20.html#performance-cache

        2
  •  3
  •   Thorbjørn Ravn Andersen    16 年前

    因为创建一个weakhashmap现在可能可以做你需要做的。

    创建两个类,一个保存标识键所需的值的键(记住实现equals()和hashcode()),以及一个保存从结果集中提取的检索值的值。最简单的可能是地图列表(每行一张地图)。

    Java将在弱化内存中的内存用完时自动使条目无效。

        3
  •  2
  •   A_M    16 年前

    如果您只想快速推出自己的缓存解决方案,请看一下 this 关于JavaSpecialist的文章,这是本书的回顾 Java Concurrency in Practice 通过 Brian Goetz .

    它讨论了使用 FutureTask 和A ConcurrentHashMap .

    这样做可以确保只有一个并发线程触发长时间运行的计算(在您的情况下,是您的SQL调用)。如果不执行类似的操作,那么当缓存为空时(例如,如果在启动应用服务器后立即处于重载状态),您将面临多个线程触发SQL调用的危险。显然,这取决于您判断这对您来说是否是一个问题,或者您是否愿意使用一个更简单的解决方案,在这个解决方案中,最后一个完成的线程将其结果放在缓存中。

    如果需要的话,您必须修改这个解决方案来添加缓存到期。同样,它也不会释放记忆,就像托尔比约恩建议使用一幅威卡什地图一样。

        4
  •  1
  •   Aleksander Lech    11 年前

    从零开始开发轮子是没有意义的。我在大Java EE应用程序中使用谷歌番石榴缓存,并绝对推荐它。您可以阅读以下内容:

    https://code.google.com/p/guava-libraries/

    直接关于缓存:

    http://guava-libraries.googlecode.com/files/JavaCachingwithGuava.pdf

    推荐文章