使用Hibernate和Spring设置分布式Infinispan缓存

一个非常典型的设置–需要分布式缓存的spring / hibernate应用程序。 但是事实证明,设置并不是那么简单。

您显然需要缓存。 可以使用EhCache,Hazelcast,Infinispan,memcached,Redis,AWS的Elasticache以及其他一些方法来执行此操作。 但是,EhCache仅支持复制的缓存,不支持分布式缓存,并且Hazelcast尚未与最新版本的Hibernate一起使用。 Infinispan和Hazelcast支持一致的哈希,因此这些条目仅存在于特定实例上,而不是在每个实例的堆上具有所有缓存的完整副本。 Elasticache是​​特定于AWS的,因此Infinispann似乎是弹簧/休眠设置中最平衡的选项。

因此,让我们首先设置休眠二级缓存。 infinispan的官方文档并不是Google排名最高的结果-它通常是非常旧的文档,或者只是2个版本的旧文档。 您最好从首页打开最新的一个 。

下面的某些选项相当“隐藏”,在文档或现有的“操作方法”中我很难找到它们。

首先,将相关的依赖项添加到您的依赖项管理器配置中。 您需要infinispan-coreinfinispan-springhibernate-infinispan 。 然后在您的configuratoin文件中(无论是哪个文件-在我的情况下是jpa.xml,这是一个定义JPA属性的弹簧文件)配置以下内容:

<prop key="hibernate.cache.use_second_level_cache">true</prop>
<prop key="hibernate.cache.use_query_cache">true</prop>
<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.infinispan.InfinispanRegionFactory</prop>
<prop key="hibernate.cache.inifinispan.statistics">true</prop>
<prop key="hibernate.cache.infinispan.cfg">infinispan.xml</prop>
<prop key="hibernate.cache.infinispan.query.cfg">distributed-query</prop>

这些设置使用默认的区域工厂启用二级缓存和查询缓存(我们将看到为什么以后可能需要将其更改为自定义的),启用统计信息,指向infinispan.xml配置文件并更改默认名称。查询缓存,以便能够使用分布式缓存(默认情况下为“本地缓存”)。 当然,您可以将所有这些外部化为.properties文件。

然后,在类路径的根目录(src / main / resources)中创建infinispan.xml:

<?xml version="1.0" encoding="UTF-8"?>
<infinispan xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="urn:infinispan:config:8.1 http://www.infinispan.org/schemas/infinispan-config-8.1.xsdurn:infinispan:config:store:jdbc:8.0 http://www.infinispan.org/schemas/infinispan-cachestore-jpa-config-8.0.xsd"xmlns="urn:infinispan:config:8.1"><jgroups><stack-file name="external-file" path="${jgroups.config.path:jgroups-defaults.xml}" />    </jgroups><cache-container default-cache="default" statistics="true"><transport stack="external-file" /><distributed-cache-configuration name="entity" statistics="true" /><distributed-cache-configuration name="distributed-query" statistics="true" /></cache-container>
</infinispan>

这期望将-Djgroups.config.path传递给JVM,以指向jgroups配置。 根据您使用的是自己的设置还是AWS,有多个选项。 在这里,您可以找到 EC2,Google云以及基本UDP和TCP机制的配置文件 。 这些应该放置在项目本身之外,因为在本地您很可能不想使用S3_PING(用于节点检测的基于S3的机制),并且值在环境之间可能会有所不同。

如果您需要统计信息(最好有它们),则必须在缓存容器级别和缓存级别都启用它们。 我实际上不知道休眠属性中的statistics选项在做什么–它对我没有任何改变。

然后定义每个缓存。 您的实体应使用类似的注释

@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "user")
public class User { .. }

然后Infinispan自动创建缓存。 它们都可以共享一些默认设置,并且这些默认值是为名为“实体”的缓存定义的。 花了我一段时间才找到答案 , 最后得到关于stackoverflow的答案 。 最后一件事是查询缓存(使用我们在休眠属性中定义的名称)。 请注意“ distributed-cache-configuration”元素-这样,您可以明确地说“此(或所有)缓存必须是分布式的”(它们将使用jgroups文件中指定的传输机制)。 如果您不想强制开发人员指定jvm参数,则可以在jgroups-defaults.xml中配置默认​​值,并指向如上例所示的默认值。

例如,您可以使用<distributed-cache-configuration name="user" />定义特定于实体的属性(检查XSD的自动完成功能以查看具有哪些配置选项( XML是一种非常方便的配置DSL,不是它吗?)。

到目前为止,一切都很好。 现在,只要我们在本地配置了正确的访问密钥,我们的缓存就可以在本地和AWS(EC2,S3)上运行。 从技术上讲,最好为本地和生产使用不同的infinispan.xml文件,并默认定义<local-cache>而不是分布式文件,因为使用TCP或UDP设置,您可能最终会与同一个网络中的其他队友组成的集群(尽管我不确定,但是可能会出现一些意外问题)。

现在,春天。 如果仅设置spring,则可以使用SpringEmbeddedCacheManagerFactoryBean创建一个bean,将classpath:infinispan.xml作为资源位置传递,它将起作用。 如果您想要完全分离的缓存管理器,则仍然可以这样做。 但是缓存管理器是棘手的。 我已经概述了EhCache的问题 ,在这里我们必须做一些变通办法,以便在hibernate和spring之间共享缓存管理器。 那是否是个好主意,取决于情况。 但是,即使您需要单独的缓存管理器,也可能需要引用休眠基础缓存管理器,因此仍需要执行以下部分步骤。 使用单独的缓存的问题是它们在其下注册的JMX名称,但是我想也可以对其进行配置。

因此,如果我们需要共享的缓存管理器,则必须创建两个工厂类的子类:

/*** A region factory that exposes the created cache manager as a static variable, so that* it can be reused in other places (e.g. as spring cache)* * @author bozho**/
public class SharedInfinispanRegionFactory extends InfinispanRegionFactory {private static final long serialVersionUID = 1126940233087656551L;private static EmbeddedCacheManager cacheManager;public static EmbeddedCacheManager getSharedCacheManager() {return cacheManager;}@Overrideprotected EmbeddedCacheManager createCacheManager(ConfigurationBuilderHolder holder) {EmbeddedCacheManager manager = super.createCacheManager(holder);cacheManager = manager;return manager;}@Overrideprotected EmbeddedCacheManager createCacheManager(Properties properties, ServiceRegistry serviceRegistry)throws CacheException {EmbeddedCacheManager manager = super.createCacheManager(properties, serviceRegistry);cacheManager = manager;return manager;}
}

是的,一个静态变量。 整,我知道,所以要小心。

然后,我们将其重新用于Spring:

/*** A spring cache factory bean that reuses a previously instantiated infinispan embedded cache manager* @author bozho**/
public class SharedInfinispanCacheManagerFactoryBean extends SpringEmbeddedCacheManagerFactoryBean {private static final Logger logger = ...;@Overrideprotected EmbeddedCacheManager createBackingEmbeddedCacheManager() throws IOException {EmbeddedCacheManager sharedManager = SharedInfinispanRegionFactory.getSharedCacheManager();if (sharedManager == null) {logger.warn("No shared EmbeddedCacheManager found. Make sure the hibernate 2nd level "+ "cache provider is configured and instantiated.");return super.createBackingEmbeddedCacheManager();}return sharedManager;}
}

然后,将hibernate配置中的hibernate.cache.region.factory_class属性更改为新的自定义类,并在我们的spring配置文件中执行以下操作:

<bean id="cacheManager" class="com.yourcompany.util.SharedInfinispanCacheManagerFactoryBean" />
<cache:annotation-driven />

Spring缓存与方法级别的@Cacheable批注一起使用,该批注允许我们缓存方法调用,我们还可以通过简单的注入访问CacheManager

然后,“最后”部分是检查它是否有效。 即使您的应用程序启动正常并且看起来运行良好,您也应该运行集成或硒测试套件,并通过JMX检查统计信息。 您甚至可能进行了使用MBean来获取有关高速缓存的某些统计数据的测试,以确保正在使用它们。

翻译自: https://www.javacodegeeks.com/2016/02/setting-distributed-infinispan-cache-hibernate-spring.html

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

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

相关文章

Element UI 的使用

官方文档&#xff1a; https://element.eleme.io/#/zh-CN/component/installation 一、普通项目引入相关文件&#xff0c;使用elementui插件&#xff1a; &#xff08;1&#xff09;引入相关文件 &#xff08;2&#xff09;可以直接使用了 vue项目使用elementui 安装 &…

python基础十一之迭代器和生成器

可迭代 内置方法中含有__iter__的数据类型都是可迭代的&#xff0c;只要是可迭代的就可以使用for循环&#xff0c;反之亦然。 print(dir()) # dir()函数可以获取当前数据类型的所有内置方法 返回值是list print(__iter__ in dir([])) # 判断是否含有__iter__内置方法 迭代器…

架构设计器_大厂案例:马蜂窝大交通业务监控报警系统架构设计与实现

部门的业务线越来越多&#xff0c;任何一个线上运行的应用&#xff0c;都可能因为各种各样的原因出现问题&#xff1a;比如业务层面&#xff0c;订单量比上周减少了&#xff0c;流量突然下降了&#xff1b;技术层面的问题&#xff0c;系统出现 ERROR &#xff0c;接口响应变慢了…

使用mpvue开发小程序

一、安装node.js 1、在官网中安装nodejs最新版本。地址&#xff1a;https://nodejs.org/en/download/&#xff0c;根据自己环境&#xff0c;进行下载安装。 2、安装完成后&#xff0c;进行nodejs版本及npm版本查看。 打开cmd命令行&#xff0c;输入 node -v 和 npm -v&#…

iOS----------UITextField实现过滤选中状态拼音

2018年上班的第二天&#xff0c;就这样背了一个大锅。我们项目中有一个搜索功能&#xff0c;在这一期的版本中&#xff0c;为了增强优化&#xff0c;去除了过滤空格的请求&#xff0c;这样或许能增加很好的用户体验&#xff0c;恰恰相反&#xff0c;偷鸡不成蚀把米。没想到苹果…

ai电磁组属于什么组_RPA+AI 创新案例挑战赛 2020 【专业组】amp;【校园组】优胜名单来也!...

大赛介绍本次大赛由 RPA 产业推进方阵为指导单位&#xff0c;来也科技为主办单位&#xff0c;面向所有来也科技合作伙伴及深圳地区大学生公开报名征集【专业组】&【校园组】参赛案例。RPA 产业推进方阵是在中国人工智能产业发展联盟指导下&#xff0c;由中国信息通信研究院…

GetSystemInfo()

关于“GetSystemInfo()”的详细信息&#xff0c;参考&#xff1a;https://msdn.microsoft.com/en-us/library/windows/desktop/ms724381(vvs.85).aspx Getting Hardware Information 例程&#xff1a;https://msdn.microsoft.com/en-us/library/windows/desktop/ms724423(vvs.8…

具有Spring Boot和Yeoman的单页Angularjs应用程序

我非常感谢yeoman之类的工具&#xff0c;它们提供了一种非常快速的方法来将不同的javascript库组合在一起成为一个一致的应用程序。 Yeoman提供了UI层&#xff0c;如果您需要开发服务层和静态资产的Web层&#xff0c;则打包的一种好方法是使用Spring Boot 。 我知道有像JHipste…

vue项目封装axios请求

目录&#xff1a; 一&#xff0c;src/utils/request.js import axios from axios import { getToken } from /utils/auth import store from /storeconst service axios.create({baseURL: process.env.VUE_APP_BASE_API,withCredentials: true,timeout: 5000,// headers:{ …

自定义函数_python3基础07函数(自定义)

"pythonic生物人"的第43篇分享。详细介绍python中&#xff1a;自定义函数的构建&#xff1b;参数传递&#xff1b;模块中调用函数。目录0、楔子1、自定义函数格式2、编写函数说明文档3、函数参数函数形参和实参区别位置实参关键字实参默认实参让实参可选传递任意数量…

v-for中用elementUI实现分页

html 分页的内容 <el-aside style"width:49%;" v-for"(item, key, index) in AirInfor.slice((currentPage-1) * pagesize, currentPage * pagesize)" :key"index"><p style"margin-bottom: 10px;"><span>区域&a…

curl -windows下接口通讯

1&#xff0c;下载curl -----url命令传输工具2&#xff0c;配置curl环境变量3&#xff0c;在cmd环境中使用举例&#xff1a;curl -G http://xxxxxxx.com&#xff1f;参数使用&#xff1a;curl -G "www.baidu.com" 最原始的批量通讯返回可以将通讯命令保存为bat格式文…

centos7建站php_centos7搭建php服务器

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":6,"count":6}]},"card":[{"des":"云服务器 ECS(Elastic Compute Service)是一…

vue项目实现登录(sessionStorage 存储 token)

前提参考&#xff1a;vue项目封装axios 思路&#xff1a; // 1, 前端校验&#xff0c;校验成功后向后台传用户名和密码&#xff08;每次请求接口都要传 token&#xff09; // 2&#xff0c; 后端收到请求&#xff0c;验证用户名和密码&#xff0c;验证成功&#xff0c;生成 to…

sqlserver 存储过程 C#调用 实现从数据库Get数据

在最近的项目中我想建立一个EFDBfirst的模型但是失败了&#xff0c;生成的edmx中没有实体类和表结构&#xff0c;到处需求解决方案&#xff0c;未果。 问题请见&#xff1a;https://q.cnblogs.com/q/102743/ 后来使用本文写的这个方法 /// 1.在sqlserver中建立存储过程 在一个d…

TIBCO BusinessWorks 6和Container Edition与BW5的比较

[本文已于一段时间前发布在TIBCO博客上 。 我还在适当的地方添加了有关BusinessWorks Container Edition&#xff08;BW CE&#xff09;的一些信息。 下面定义的大多数特性对于BW6和BW CE均适用。 TIBCO ActiveMatrix BusinessWorks 6&#xff08;BW6&#xff09;是一个现代化…

修改jwt过期时间_PostgreSQL如何修改用户过期时间

生产环境中&#xff0c;有时候需要设置一个有时效的临时帐户&#xff0c;供一段时间内&#xff0c;某些需要的使用&#xff0c;过期帐号自己禁用&#xff0c;但有时候因为更多的需求&#xff0c;需要对这种有过期时间的帐号进行延长过期时间&#xff0c;这时候就需要使用命令行…

vue使用echarts图表

https://www.jianshu.com/p/2894b781063b 1、安装 npm install echarts // npm install echarts --save2、引入 echarts import * as echarts from echarts;3、写一个div容器用来承载图表: <div id"teamLeader"></div>4、写一个方法&#xff0c;&am…

云计算入门

根据美国国家标准与技术研究院定义&#xff1a;云计算是一种按使用量付费的模式&#xff0c;这种模式提供可用的、便捷的、按需的网络访问&#xff0c; 进入可配置的计算资源共享池&#xff08;资源包括网络&#xff0c;服务器&#xff0c;存储&#xff0c;应用软件&#xff0c…

20180105随笔

过滤器的执行过程&#xff1a;// 目标资源执行前执行chain.doFilter(request, response);// 目标资源执行后执行文件上传的前提&#xff1a;1.表单的method方法必须是post2.表单的enctype类型必须是&#xff1a;multipart/form-data3.表单中input的上传输入域为&#xff1a;<…