使用Infinispan作为持久性解决方案
從https://vaadin.com/blog/-/blogs/using-infinispan-as-a-persistency-solution交叉發(fā)布。 感謝Fredrik和Matti的允許!
各種RDBMS是持久性的實(shí)際標(biāo)準(zhǔn)。 建筑師認(rèn)為使用它們是一個(gè)安全的選擇,我敢說現(xiàn)在它們在很多地方都使用過。 為了解決這個(gè)問題,我最近一直在探索其他持久性選項(xiàng),例如圖數(shù)據(jù)庫 。 這次我和Infinispan一起玩。
如果您通常不熟悉Infinispan或分布式鍵/值數(shù)據(jù)存儲,則可以將其視為類固醇上的HashMap。 最本質(zhì)上,該映射在所有群集節(jié)點(diǎn)之間共享。 借助群集,您可以獲得巨大的規(guī)模,實(shí)現(xiàn)快速訪問和冗余,這取決于您如何配置它。 有幾種與Infinispan競爭的產(chǎn)品,例如OS world的Ehcache和Hazelcast以及商業(yè)方面的Oracle Coherence 。
實(shí)際上,Infinispan是一種您可能根本沒有注意到的技術(shù)。 例如, Wildfly的高可用性功能在很大程度上依賴Infinispan緩存。 它還經(jīng)常用作ORM庫的二級緩存。 但是它本身也可以直接用作持久性庫。
為什么將其視為您的持久性解決方案:
- 這是閃電般的快速內(nèi)存數(shù)據(jù)存儲
- 存儲的值可以是任何可序列化的對象,不需要復(fù)雜的映射庫
- 它是為群集環(huán)境從頭開始構(gòu)建的–您的數(shù)據(jù)更安全,更快速地訪問。 水平縮放非常容易
- 它具有多種可選的高速緩存存儲選項(xiàng),用于將狀態(tài)寫入磁盤(例如,集群范圍內(nèi)的重新引導(dǎo))
- 并非所有數(shù)據(jù)都需要永久存儲,Infinispan具有內(nèi)置的復(fù)雜逐出規(guī)則
- 使用事務(wù)訪問進(jìn)行ACID更改的可能性
聽起來很棒,不是嗎? 它肯定是針對某些用例的,但是所有技術(shù)都有其弱點(diǎn),鍵/值數(shù)據(jù)存儲也是如此。 與RDBMS相比,最大的缺點(diǎn)是與其他實(shí)體的關(guān)系。 您將不得不提出一種策略,該策略用于存儲對其他實(shí)體的引用,并且還必須解決基于相關(guān)特征的搜索。 如果您最終想知道這些問題,請確保檢查Hibernate OGM是否可以為您提供幫助。
同樣,對數(shù)據(jù)進(jìn)行一些分析也可以被認(rèn)為比傳統(tǒng)的SQL查詢更簡單,或者至少更熟悉。 特別是如果最終有大量數(shù)據(jù)分布在多個(gè)節(jié)點(diǎn)上,則必須學(xué)習(xí)MapReduce編程模型的基礎(chǔ)知識才能進(jìn)行任何非平凡的查詢。
在Web應(yīng)用程序中使用Infinispan
盡管Infinispan與Wildfly無關(guān),但我還是決定將實(shí)驗(yàn)基于Wildfly。 如果您明確要求,它的內(nèi)置版本可用于Web應(yīng)用程序。 最簡單的方法是將以下MANIFEST.MF條目添加到您的war文件中。 如果您不想用過時(shí)的文件來破壞項(xiàng)目,只需使用一個(gè)小的war插件配置將其添加即可。
Dependencies: org.infinispan export當(dāng)然,您仍然需要向應(yīng)用程序中添加Infinispan依賴項(xiàng),但是您可以將其保留為提供。 確保使用服務(wù)器提供的相同版本,在Wildlfy 8中,Infinispan版本為6.0.2。 在Maven項(xiàng)目中,添加這種依賴項(xiàng)聲明:
<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“緩存”之前,您需要對其進(jìn)行配置。 既有編程配置也有xml配置。 使用Wildfly,最自然的是將Infinispan數(shù)據(jù)存儲直接配置到服務(wù)器配置中。 “正確的”配置文件取決于您如何啟動Wildfly服務(wù)器。 如果要在本地測試群集,則可能要在<subsystem xmlns="urn:jboss:domain:infinispan:2.0">部分下將類似的內(nèi)容添加到您的domain.xml中。
<cache-container name="myCache" default-cache="cachedb"><transport lock-timeout="60000"/><replicated-cache name="cachedb" batching="true" mode="SYNC"/> </cache-container>請注意,使用此配置,數(shù)據(jù)僅存儲在群集節(jié)點(diǎn)的內(nèi)存中。 要了解如何調(diào)整緩存設(shè)置或設(shè)置磁盤“備份”,請參閱詳盡的Infinispan文檔 。
為了從UI代碼中刪除所有Infinispan引用,我創(chuàng)建了一個(gè)執(zhí)行所有數(shù)據(jù)訪問的EJB。 在那里,我注入了Wildfly提供的CacheContainer并在init方法中獲取默認(rèn)緩存。
@Resource(lookup = "java:jboss/infinispan/container/myCache") CacheContainer cc;Map<String, MyEntity> cache;@PostConstruct void init() {this.cache = cc.getCache(); }我想您已經(jīng)想知道了:是的,Map是非常熟悉的java.util.Map接口,其余實(shí)現(xiàn)對任何Java開發(fā)人員都是微不足道的。 Infinispan緩存擴(kuò)展了基本的Map界面,但是如果您需要一些更高級的功能,則還可以使用Cache或AdvancedCache類型。
上一個(gè)代碼片段中的MyEntity只是我為該示例創(chuàng)建的一個(gè)非常簡單的POJO。 通過使用Vaadin CDI,我可以將EJB注入到UI類中并對其執(zhí)行幾乎所有操作。 實(shí)際的Vaadin代碼沒有特殊的技巧,只是普通的CDI加香料的Vaadin代碼。
基于此練習(xí),我是否可以直接使用Infinispan來保持下一個(gè)項(xiàng)目的持久性? 可能不是,但是對于某些應(yīng)用程序,毫不猶豫。 我還可以想象某些混合模型,其中某些數(shù)據(jù)僅在Infinispan緩存中,而某些數(shù)據(jù)在傳統(tǒng)RDBMS中,自然在ORM之后,同時(shí)兼顧了兩者的優(yōu)點(diǎn)。
我們還將在2014年9月8日與RedHat的Arun Gupta舉行的聯(lián)合網(wǎng)絡(luò)研討會中使用Infinispan。在這里,我們將向您展示一個(gè)簡單的Vaadin應(yīng)用程序,以及使用Wildfly對其進(jìn)行集群的便捷程度。
翻譯自: https://www.javacodegeeks.com/2014/09/using-infinispan-as-a-persistency-solution.html
總結(jié)
以上是生活随笔為你收集整理的使用Infinispan作为持久性解决方案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小卧室怎么设计装修好看(小房间的装修设计
- 下一篇: 华硕b350超频设置(华硕b350m超频