2012-11-15 164 views
4

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

所以我们一直在想的是一个解决方案,它允许我们获得所有本地需要的数据。我们希望减少从数据库中检索的数据量并重写到缓存。例如,当一个实体被修改时,我们不希望使该表上的所有缓存查询无效,我们宁愿希望能够修改本地缓存查询结果集,因此查询仍然可以从本地运行缓存的数据。 缓存必须复制其更改\从数据库中检索由其他应用程序实例修改的数据。

我们一直在寻找EhCache作为Hibernate二级缓存,但它会使任何表修改上给定表的所有缓存查询无效。我快速浏览了Hibernate Services,但不知道它是否允许我们重写hibernate的二级缓存默认行为以满足我们的需求。

我们可以使用其他解决方案吗?

编辑我们想要非常快速地访问数据。有效地,我们正在寻找的是一个可以缓存的缓存。

+3

为什么不创建一个本地数据库并将其复制到远程?它将避免除连接字符串之外的任何代码更改,提供更高的速度并确保与远程数据库的数据一致性。 –

+0

您是否为每个应用程序实例建议一个数据库实例?对我来说似乎是一个很大的设置开销。 –

+0

否 - 在本地服务器/虚拟机上运行数据库的完整副本,然后将其复制到远程 - 以主/从关系。 –

回答

3

你检出了JBoss缓存吗?您可以分别为查询定义逐出策略,并且可以非常容易地在群集节点之间同步。如果你需要的话,你可以阅读关于我编译的文章的文章,如果它对你有帮助的话;

http://dinukaroshan.blogspot.com/2009/10/jboss-caching-integration.html

+0

可以使用JBoss更改默认的hibernate第二级缓存行为,在每次修改完成时都会使表上的所有缓存查询无效?由于查询缓存仅对静态数据有意义,所以标准hibernate二级缓存不符合我们的需求。 – Bart

+0

嗨巴特,通常的经验法则是缓存很少更改,但经常阅读(例如主数据)的数据..我不知道如果您可以更改无效规则..但会检查并取回给您.. – dinukadev

2

如果你使用了Ehcache和你在集群多个应用程序,你将不得不使用一种机制(JMS,JGroups的,...)的数据高速缓存复制。

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

看来您正在寻找EhCache的“通过复制更新”功能。让我列举一个的Ehcache的配置的可能性:通过复制

更新VS失效

更新通过复制:数据发送到所有节点
优点:避免缓存
的完全重新加载 缺点:节点之间的非相干数据是可能&无用的,如果所述高速缓存的数据的TTL是低

经由无效更新:通知的无效发送到所有节点。如果数据已被缓存,则节点会再次删除缓存的数据以查询数据库。
优点:数据一致性&网络流量打火机
缺点:数据库查询的地段,它可能会导致数据的大量需求同时


异步VS同步

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

同步
优点:数据完整性
缺点:香水,卫生


我希望它帮你选择了正确的决定。

0

缓存查询结果的失效并不是缓存控制的事情,而是Hibernate如何处理他的QueryCache ......我没有看到如何改变这个代码。另外,我不认为坦白地说,这个问题有更好的“适合所有”的解决方案。

所以,如果你想非常专门缓存查询结果,我想你必须自己实现。

另外,如果你需要更高的一致性保证,你可能会想使用集群缓存,而不是复制一个......