Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要Java缓存解决方案_Java_Hibernate_Caching_Ehcache - Fatal编程技术网

需要Java缓存解决方案

需要Java缓存解决方案,java,hibernate,caching,ehcache,Java,Hibernate,Caching,Ehcache,我正在为Java Web应用程序寻找缓存解决方案。我们有一个Oracle数据库实例和2-3个远程数据库实例。 我们希望将数据本地缓存到我们的应用程序中,因为我们无法接受db响应时间。 我们的数据集具有平均大小(每个表几千行),并且从应用程序中手动修改(所以不太经常)(没有直接的数据库访问) 因此,我们一直在考虑的是一个解决方案,它允许我们拥有本地所需的所有数据。我们希望减少从数据库中检索并重写到缓存的数据量 例如,当修改一个实体时,我们不希望使该表上的所有缓存查询无效,而是希望能够修改本地缓存的

我正在为Java Web应用程序寻找缓存解决方案。我们有一个Oracle数据库实例和2-3个远程数据库实例。 我们希望将数据本地缓存到我们的应用程序中,因为我们无法接受db响应时间。 我们的数据集具有平均大小(每个表几千行),并且从应用程序中手动修改(所以不太经常)(没有直接的数据库访问)

因此,我们一直在考虑的是一个解决方案,它允许我们拥有本地所需的所有数据。我们希望减少从数据库中检索并重写到缓存的数据量

例如,当修改一个实体时,我们不希望使该表上的所有缓存查询无效,而是希望能够修改本地缓存的查询结果集,以便仍然可以从缓存数据在本地运行查询。 缓存必须复制其更改\从数据库检索由其他应用程序实例修改的数据

我们一直将EhCache视为Hibernate二级缓存,但它会在任何表修改时使给定表的所有缓存查询无效。我快速查看了Hibernate服务,但不知道这是否允许我们覆盖Hibernate二级缓存默认行为以满足我们的需要

我们还有其他的解决方案吗


编辑我们希望能够快速访问数据。实际上,我们正在寻找的是一个quaryable缓存。

您签出JBoss缓存了吗?您可以单独为查询定义逐出策略,并且在集群节点之间很容易同步。如果你需要的话,你可以阅读一下我在某个时候根据我的经验编辑的文章,如果它对你有帮助的话


如果您使用EhCache,并且集群中有多个应用程序,则必须使用一种机制(JMS、JGroups等)进行数据缓存复制

您必须注意的一点是,如果您有另一个应用程序未在Java中运行,则不会通知应用程序:JGroups仅在Java中可用,而您的非Java应用程序将无法使缓存的实体无效。EhCache/Jgroups支持允许您在一个配置文件中设置复制(无需其他代码!)

您似乎正在寻找EhCache的“通过复制更新”功能。让我列出EhCache的一种配置可能性:

通过复制与无效更新

通过复制更新:发送到所有节点的数据
优点:避免完全重新加载缓存
缺点:如果缓存数据的TTL较低,则节点之间可能存在不一致的数据&这是无用的

通过失效更新:向所有节点发送失效通知。如果数据已被缓存,则节点将删除缓存的数据并再次查询数据库。
优点:数据一致性和网络流量减少
缺点:大量的数据库查询可能同时导致大量的数据需求


异步与同步

异步
优点:快速回复和数据传输
缺点:UDP

同步
优点:数据完整性
缺点:性能



我希望它能帮助您做出正确的决定。

缓存查询结果的失效不是缓存所能控制的,而是Hibernate处理查询缓存的方式。。。除非修改代码,否则我不知道你会怎么做。此外,坦率地说,我不认为有更好的“适合所有人”的解决方案

所以,如果您想要非常专门的查询结果缓存,我想您必须自己实现它


此外,如果您需要更高的一致性保证,您可能希望使用集群缓存,而不是复制缓存

为什么不创建一个本地数据库并将其复制到远程?它将避免除了连接字符串之外的任何代码更改,提供更高的速度并确保与远程数据库的数据一致性。您是否建议每个应用程序实例使用一个数据库实例?对我来说,似乎有很多设置开销。否-在本地服务器/虚拟机上运行数据库的完整副本,然后以主/从关系将其复制到远程。您仍然没有在应用层缓存任何数据,这种方法需要始终从数据库读取任何正在处理的请求。我认为这样做是为了避免每次点击数据库都会受到惩罚。我们希望能够非常快速地访问数据。实际上,我们正在寻找的是一个quaryable缓存。使用JBoss是否可以改变默认的hibernate二级缓存行为,即每次修改表时都使表上的所有缓存查询无效?标准hibernate二级缓存不能满足我们的需求,因为查询缓存只对静态数据有意义。Hi Bart,通常的经验法则是缓存很少更改但经常读取的数据(例如主数据)。。我不确定你是否能改变失效规则。。但我会检查一下,然后再给你回复。。