用于集群企业应用程序的jboss数据网格 - 什么是有效的方法

时间:2018-06-19 04:10:17

标签: infinispan jboss-eap-6 jboss-eap-7 redhat-datagrid

我们正在使用JTA事务和hibernate进行集群企业应用程序,以便在JBoss EAP上部署数据库操作。

为了提高系统性能,我们计划使用Jboss数据网格。这就是我计划使用jboss数据网格的方法:

  • 我在使用cache.put
  • 在数据库中插入/更新时添加/替换对象是缓存
  • 从数据库中删除对象时,使用cache.remove从缓存中删除
  • 在检索时,首先尝试使用密钥或查询从缓存中获取数据。如果数据不存在,请从数据库加载数据。

但是,我对数据网格有以下问题:

  • 要查询我们正在使用hibernate条件的对象,但数据网格使用自己的查询构建器。我们可以避免为hibernate和datagrid编写单独的查询吗?
  • 我想要一个符合条件的对象列表。如果符合条件的其中一个对象从缓存中逐出,是否会自动从数据库重新加载?
  • 如果回滚事务,它也会从数据网格缓存中回滚
  • 我是否可以参考我的数据网格实现?
  • 哪个更适合我的需求infinispan作为库或远程模式的二级缓存或数据网格?

1 个答案:

答案 0 :(得分:0)

Galder的评论是正确的,最佳实践是将Infinispan用作第二级缓存提供程序。独自实现它很容易出现计时问题(缓存中有陈旧/未更新的条目)。

关于查询:使用2LC查询缓存时,在缓存中保留“ sql查询”->“结果列表”的映射。但是,一旦您更新了查询中使用的任何类型,所有这些查询都将失效(例如,如果查询中列出了年龄> 60岁的人,则更新新生儿仍然会使该查询无效)。因此,只有在查询优先于更新时,才应启用此功能。

Infinispan拥有自己的查询支持,但是将其用作2LC提供程序时不会公开。假定缓存仅保留数据库中实体的(最常访问的)子集子集,因此此类查询的结果将不正确。

如果您想使用Infinispan但要保持数据库的持久性,则可以选择使用JPA缓存存储(和索引)。请注意,尽管没有经过Infinispan的DB更新不会反映在缓存中,并且索引编制可能会有些滞后(因为它是异步的)。您可以拆分数据集,并将JPA用于一个部分,并将Infinispan + JPA缓存存储用于另一个部分。

第三个选择是使用Hibernate Search,它将数据保留在数据库中,但索引存储在Lucene中(也可能存储在Infinispan缓存中),并且您不使用Criteria API,而是使用Hibernate Search API