0

我们有一个使用 JTA 事务和休眠的集群企业应用程序,用于部署在 JBoss EAP 上的数据库操作。

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

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

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

  • 为了查询对象,我们使用休眠条件,但是数据网格使用它自己的查询构建器。我们可以避免为休眠和数据网格编写单独的查询吗?
  • 我想要返回匹配条件的对象列表。如果符合条件的对象之一被从缓存中逐出,它是否会自动从数据库中重新加载?
  • 如果事务被回滚,它是否也会从数据网格缓存中回滚
  • 是否有任何示例可以参考我的数据网格实现?
  • 对于我的要求 infinispan 作为库或远程模式下的二级缓存或数据网格,哪个是更好的选择?
4

1 回答 1

0

Galder 的评论是对的,最佳实践是使用 Infinispan 作为二级缓存提供程序。尝试自己实现它很容易出现时间问题(缓存中有陈旧/未更新的条目)。

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

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

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

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

于 2018-06-25T08:05:34.793 回答