我正在寻找Java应用程序的缓存解决方案。我们有一个Oracle db实例和2-3个远程到数据库的实例.我们希望本地缓存数据到我们的应用程序,因为我们不能接受db响应时间。我们的数据集具有平均大小(每个表只有几千行),并且是从我们的应用程序(没有直接的数据库访问)手动修改(所以不经常)。
因此,我们一直在考虑的是一种解决方案,它允许我们拥有本地需要的所有数据。我们希望减少从db检索并重写到缓存的数据量。
因此,例如,当一个实体被修改时,我们不想使该表上所有缓存的查询失效,我们更希望能够修改本地缓存的查询结果集,这样查询仍然可以从缓存的数据在本地运行。缓存必须复制它们的更改\从db检索其他应用程序实例修改的数据。
我们一直将EhCache视为Hibernate 2级缓存,但它使对任何表修改的给定表的所有缓存查询无效。我快速查看了Hibernate服务,但还不知道这是否允许我们覆盖hibernate 2级缓存默认行为以满足我们的需求。
我们还有什么其他的解决办法吗?
编辑我们希望能够非常快地访问数据。实际上,我们要找的是一个四边形的缓存。
发布于 2012-11-15 12:15:55
您签出JBoss缓存了吗?您可以单独定义查询的驱逐策略,还可以很容易地在集群节点之间进行同步。如果你需要的话,你可以读一读我在一段时间前编辑的文章,如果这对你有帮助的话;
http://dinukaroshan.blogspot.com/2009/10/jboss-caching-integration.html
发布于 2012-11-15 12:31:14
如果使用EhCache,并且集群中有多个应用程序,则必须使用一种机制(JMS、JGroups、.)用于数据缓存复制。
您必须注意的一件事是,如果您的另一个应用程序没有在Java中运行,则不会通知应用程序: JGroups只在Java中可用,而非Java应用程序将无法使缓存的实体失效。EhCache/Jgroup支持允许您在一个配置文件中设置复制(不需要额外的代码!)
您似乎在寻找EhCache的“通过复制更新”功能。让我列举一下EhCache的配置可能性:
通过复制和无效的更新
通过复制更新:发送到所有节点的数据
优点:避免缓存完全重新加载。
缺点:节点间不连贯的数据是可能的&如果缓存的数据的TTL较低,则无效。
通过无效更新:发送到所有节点的失效通知。如果数据已经被缓存,节点将再次删除缓存的数据查询。
优点:数据一致性和网络流量更轻。
缺点:大量的数据库查询,可能同时导致大量的数据需求。
异步与同步
异步
优点:快速回复和数据传输
缺点: UDP..。
同步
优点:数据完整性
缺点: Perf..。
我希望它能帮助你做出正确的决定。
发布于 2012-11-22 18:17:24
缓存查询结果的失效不是缓存控制的事情,而是Hibernate如何处理他的QueryCache.除非修改代码,否则我看不出你会怎么做。此外,坦率地说,我不认为有更好的“适合所有人”的解决办法。
因此,如果您想要对查询结果进行非常专门的缓存,我想您必须自己实现。
此外,如果您需要更高的一致性保证,您可能希望使用群集缓存,而不是复制缓存.
https://stackoverflow.com/questions/13396875
复制相似问题