从https://vaadin.com/blog/-/blogs/using-infinispan-as-a-persistency-solution交叉发布。 感谢Fredrik和Matti的允许!
各种RDBMS是持久性的实际标准。 建筑师认为使用它们是一个安全的选择,我敢说现在它们在很多地方都使用过。 为了解决这个问题,我最近一直在探索其他持久性选项,例如图数据库 。 这次我和Infinispan一起玩。
如果您通常不熟悉Infinispan或分布式键/值数据存储,则可以将其视为类固醇上的HashMap。 最本质上,该映射在所有群集节点之间共享。 借助群集,您可以获得巨大的规模,实现快速访问和冗余,这取决于您如何配置它。 有几种与Infinispan竞争的产品,例如OS world的Ehcache和Hazelcast以及商业方面的Oracle Coherence 。
实际上,Infinispan是一种您可能根本没有注意到的技术。 例如, Wildfly的高可用性功能在很大程度上依赖Infinispan缓存。 它还经常用作ORM库的二级缓存。 但是它本身也可以直接用作持久性库。
为什么将其视为您的持久性解决方案:
- 这是闪电般的快速内存数据存储
- 存储的值可以是任何可序列化的对象,不需要复杂的映射库
- 它是为群集环境从头开始构建的–您的数据更安全,更快速地访问。 水平缩放非常容易
- 它具有多种可选的高速缓存存储选项,用于将状态写入磁盘(例如,集群范围内的重新引导)
- 并非所有数据都需要永久存储,Infinispan具有内置的复杂逐出规则
- 使用事务访问进行ACID更改的可能性
听起来很棒,不是吗? 它肯定是针对某些用例的,但是所有技术都有其弱点,键/值数据存储也是如此。 与RDBMS相比,最大的缺点是与其他实体的关系。 您将不得不提出一种策略,该策略用于存储对其他实体的引用,并且还必须解决基于相关特征的搜索。 如果您最终想知道这些问题,请确保检查Hibernate OGM是否可以为您提供帮助。
同样,对数据进行一些分析也可以被认为比传统的SQL查询更简单,或者至少更熟悉。 特别是如果最终有大量数据分布在多个节点上,则必须学习MapReduce编程模型的基础知识才能进行任何非平凡的查询。
在Web应用程序中使用Infinispan
尽管Infinispan与Wildfly无关,但我还是决定将实验基于Wildfly。 如果您明确要求,它的内置版本可用于Web应用程序。 最简单的方法是将以下MANIFEST.MF条目添加到您的war文件中。 如果您不想用过时的文件来破坏项目,只需使用一个小的war插件配置将其添加即可。
Dependencies: org.infinispan export
当然,您仍然需要向应用程序中添加Infinispan依赖项,但是您可以将其保留为提供。 确保使用服务器提供的相同版本,在Wildlfy 8中,Infinispan版本为6.0.2。 在Maven项目中,添加这种依赖项声明:
<dependency>
<groupId>org.infinispan</groupId>
<artifactId>infinispan-core</artifactId>
<version>6.0.2.Final</version>
<!-- Provided as we use the Infinispan provided by Wildfly -->
<scope>provided</scope>
</dependency>
在访问Infinispan“缓存”之前,您需要对其进行配置。 既有编程配置也有xml配置。 使用Wildfly,最自然的是将Infinispan数据存储直接配置到服务器配置中。 “正确的”配置文件取决于您如何启动Wildfly服务器。 如果要在本地测试群集,则可能要在<subsystem xmlns="urn:jboss:domain:infinispan:2.0">
部分下将类似的内容添加到您的domain.xml中。
<cache-container name="myCache" default-cache="cachedb">
<transport lock-timeout="60000"/>
<replicated-cache name="cachedb" batching="true" mode="SYNC"/>
</cache-container>
请注意,使用此配置,数据仅存储在群集节点的内存中。 要了解如何调整缓存设置或设置磁盘“备份”,请参阅详尽的Infinispan文档 。
为了从UI代码中删除所有Infinispan引用,我创建了一个执行所有数据访问的EJB。 在那里,我注入了Wildfly提供的CacheContainer并在init方法中获取默认缓存。
@Resource(lookup = "java:jboss/infinispan/container/myCache")
CacheContainer cc;
Map<String, MyEntity> cache;
@PostConstruct
void init() {
this.cache = cc.getCache();
}
我想您已经想知道了:是的,Map是非常熟悉的java.util.Map接口,其余实现对任何Java开发人员都是微不足道的。 Infinispan缓存扩展了基本的Map界面,但是如果您需要一些更高级的功能,则还可以使用Cache或AdvancedCache类型。
上一个代码片段中的MyEntity只是我为该示例创建的一个非常简单的POJO。 通过使用Vaadin CDI,我可以将EJB注入到UI类中并对其执行几乎所有操作。 实际的Vaadin代码没有特殊的技巧,只是普通的CDI加香料的Vaadin代码。
基于此练习,我是否可以直接使用Infinispan来保持下一个项目的持久性? 可能不是,但是对于某些应用程序,毫不犹豫。 我还可以想象某些混合模型,其中某些数据仅在Infinispan缓存中,而某些数据在传统RDBMS中,自然在ORM之后,同时兼顾了两者的优点。
我们还将在2014年9月8日与RedHat的Arun Gupta举行的联合网络研讨会中使用Infinispan。在这里,我们将向您展示一个简单的Vaadin应用程序,以及使用Wildfly对其进行集群的便捷程度。
翻译自: https://www.javacodegeeks.com/2014/09/using-infinispan-as-a-persistency-solution.html