使用Infinispan作为持久性解决方案

从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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/362399.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS布局之脱离文档流详解——浮动、绝对定位脱离文档流的区别

1、代码 &#xff08;1&#xff09;示例代码1 <!DOCTYPE html><html lang"zh"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><meta http-e…

小程序 获取当前城市位置-高德地图

微信小程序 wx.getLocation 只能获取到经纬度&#xff0c;想要获取具体城市信息&#xff0c;需要使用地图插件。公司要求使用 高德地图&#xff0c;在使用上&#xff0c;几个地图的代码步骤都差不多。 目录 1. 查看官方文档 1.1 申请高德地图Key&#xff0c;点击查看申请key…

会议之于思考

从开始学习英语,我们几乎每天都要开会,讨论问题,确切的说是我们提出疑问,老师在给我们解答.这样高密集的开会,在提高班还是很少见到的 因为老师一个人带了很多学生,还有其他的工作要做.平时可是享受不到这样的待遇的.(其实我们的开会就是上课) 开的会多了,我就想到一个问题.为什…

摇篮善良:仅添加包装用于战争

我的同事Tom Wetjens 在Maven中撰写了博客文章仅打包依赖项 。 当我们想在WAR文件中包含依赖项时&#xff0c;他展示了一种Maven解决方案&#xff0c;而在其他任何作用域中都没有使用。 在这篇博客中&#xff0c;我们将看到我们如何在Gradle中解决这个问题。 假设我们在项目中…

网页端调用企业微信扫一扫 详细过程

效果展示&#xff08;需要使用微信内置浏览器打开&#xff09;&#xff1a; 目录 1. 快速集成H5开发应用 1.1 开始 1.2 创建应用 1.2.1 登录管理后台 1.2.2 添加自建应用 1.2.3 配置应用 1.2.4 获取应用的 AgentID 与 Secret 1.3 配置应用 1.3.1 配置应用主页 1.3.2 配置…

获取ip地址

代码 ///<summary>///取得客户端真实IP。如果有代理则取第一个非内网地址 ///</summary>publicstringIPAddress { get{ stringresult String.Empty; result HttpContext.Current.Request.ServerVariables["HTTP_X_FORWAR…

Oracle DBA 学习总结

对于学习Oracle 数据库&#xff0c;应该先要了解Oracle 的框架。它有物理结构&#xff08;由控制文件、数据文件、重做日志文件、参数文件、归档文件、密码文件组成&#xff09; &#xff0c;逻辑结构&#xff08;表空间、段、区、块&#xff09;&#xff0c;内存分配&#xff…

lodash round

_.round(number, [precision0])根据 precision 四舍五入 number。 _.round(4.006);// > 4_.round(4.006, 2);// > 4.01_.round(4060, -2);// > 4100 更多专业前端知识&#xff0c;请上 【猿2048】www.mk2048.com

可怕的DefaultAbstractHelperImpl

不久前&#xff0c;我们发布了这个有趣的游戏&#xff0c;我们称之为Spring API Bingo 。 当形成有意义的类名时&#xff0c;它是对Spring的巨大创造力的赞美和奉承。 FactoryAdvisorAdapterHandlerLoader ContainerPreTranslatorInfoDisposable BeanFactoryDe​​stination…

微信小程序 监听位置信息

wx.onLocationChange(function callback) | 微信开放文档微信开发者平台文档https://developers.weixin.qq.com/miniprogram/dev/api/location/wx.onLocationChange.html 小程序 获取当前城市位置-高德地图_Start2019-CSDN博客小程序获取位置信息&#xff0c;包括省市区、用户…

通过构建Cocoapods私有库进行组件化开发探索

专题一 一、创建私有索引库 选Github或者码云都可以&#xff0c;本例以Github为例。创建私有索引库用来作为自己组件库的索引&#xff1a; 二、本地添加私有索引库 添加&#xff1a;pod repo add 索引库名称 索引库地址 例&#xff1a;pod repo add ZYHModule https://github.c…

lodash 数组元素查找 findIndex

_.findIndex(array, [predicate_.identity])这个方法类似 _.find。除了它返回最先通过 predicate 判断为真值的元素的 index &#xff0c;而不是元素本身。<!DOCTYPE html><html lang"zh"><head><meta charset"UTF-8" /><meta …

layui 父页面弹框中获取子页面的内容

layer弹层组件开发文档 - Layuihttps://www.layui.site/doc/modules/layer.html#layer.getChildFrame 需求及代码分析 如上图&#xff0c;原来是点击一个按钮跳转到子页面&#xff0c;现在想改为&#xff1a;点击按钮&#xff0c;在当前页打开。因为不想要重写子页面的样式及内…

在JBoss Fuse / Fabric8 / Karaf中使用Byteman

您是否曾经尝试过了解一些非常简单的方法不起作用的过程&#xff1f; 您正在任何众所周知的上下文中编写代码&#xff0c;无论出于何种原因它都无法正常工作。 而且您信任您的平台&#xff0c;因此您认真阅读了所有日志。 而且&#xff0c;您仍然不知道为什么某些行为不符合预…

个人作业——Alpha项目测试

一、 这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass1/ 这个作业要求在哪里 https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass1/homework/3338 团队名称 西柚皇家编程团队&#xff1a;https://www.cnblogs.com/TakeRa…

HttpURLConnection的警告

这段代码对您来说还不错吗&#xff1f; HttpURLConnection connection null; try {connection (HttpURLConnection) url.openConnection();try (InputStream in url.getInputStream()) {return streamToString(in);} } finally {if (connection ! null) connection.disconn…

LeapFTP 注册码

LeapFTP v2.7.6.613 汉化版II 特别版Name:crsky Code:214065-658136565http://www.crsky.com/soft/664.htmlLeapFTP v2.7.6.613 英文版http://www.crsky.com/soft/378.htmlName:crsky Code:214065-658136565------------LeapFTP 2.7.6.613 汉化版软件类别&#xff1a;汉化补丁/…

Windows7下Docker的安装

转自 https://blog.csdn.net/xiangxiezhuren/article/details/79698913 无法打开图3&#xff0c;打开属性。给其添加git路径 无法使用图2下载 https://www.cnblogs.com/huang-yc/p/10350408.html 转载于:https://www.cnblogs.com/shufeiyang/p/11016177.html

简而言之,JUnit:单元测试断言

简而言之&#xff0c;本章涵盖了各种单元测试断言技术。 它详细说明了内置机制&#xff0c; Hamcrest匹配器和AssertJ断言的优缺点 。 正在进行的示例扩大了该主题&#xff0c;并说明了如何创建和使用自定义匹配器/断言。 单元测试断言 信任但要验证 罗纳德里根&#xff08;R…

vue 安装使用mockjs

使用 mockjs 的案例过程&#xff1a; 1. 安装 npm install axios -S npm install mockjs --save-dev npm install --save 、--save-dev 、-D、-S 的区别与NODE_ENV的配置_jwl_willon的博客-CSDN博客_npm save备注&#xff1a;<> 意为等价于&#xff1b;1、npm install …