1

我使用 JBoss AS。我有一个在应用程序服务器内运行的又长又重的 SQL。我想根据输入参数缓存结果。

我在这里有几个选择:

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

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

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

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

这是否可以使用 JBoss Cache 或 ehcache 或两者来实现。


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

我应该将结果包装在实体中吗?然后,我怎样才能让它像 oracle 中的(物化?)视图一样工作 - 自动更新或通过触发器更新。

4

4 回答 4

5

您必须将数据从对象中取出ResultSet并放入对象中才能缓存它,所以为什么不直接开始使用 Hibernate,它使用多种选项提供缓存,包括 Ehcache、JBoss Cache 和一个简单的 Map。

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

于 2009-06-23T09:30:40.157 回答
3

对于启动 WeakHashMap 可能现在可以做你需要的。

创建两个类,一个 Key 保存识别键所需的值(记得实现 equals() 和 hashcode()),一个 Value 保存从 ResultSet 中提取的检索值。最简单的可能是地图列表(每行一个地图)。

当 WeakHashMap 中的内存不足时,Java 将自动使条目无效。

于 2009-06-23T06:46:12.343 回答
2

如果您只想快速推出自己的缓存解决方案,请查看JavaSpecialist上的这篇文章,这是对Brian Goetz的Java Concurrency in Practice一书的评论。

它讨论了使用FutureTaskConcurrentHashMap实现基本的线程安全缓存。

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

如果需要,您必须修改此解决方案以添加缓存到期。此外,它不会像 Thorbjørn 建议的使用 Wea​​kHashMap 那样释放内存。

于 2009-06-23T14:00:18.800 回答
2

从头开始开发轮子是没有意义的。我在大型 Java EE 应用程序中使用 Google Guava Cache,我肯定会推荐它。您可以阅读更多内容:

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

并直接关于缓存:

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

于 2014-05-31T20:20:10.587 回答