Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 弹簧靴&x2B;Grails共享Hibernate二级缓存_Spring_Hibernate_Caching_Grails - Fatal编程技术网

Spring 弹簧靴&x2B;Grails共享Hibernate二级缓存

Spring 弹簧靴&x2B;Grails共享Hibernate二级缓存,spring,hibernate,caching,grails,Spring,Hibernate,Caching,Grails,我有一个单一的Web服务,我计划随着时间的推移转换成更小的微服务。该应用程序目前是用Grails编写的,但微服务并不需要Grails提供的所有功能,因此我们的想法是使用一个更轻量级的框架(如果有的话)。为了从数据库中卸载工作,还应使用Hibernate二级缓存 在这一切发生之前,我开始研究分布式/集群缓存和不同的框架,以了解计划的内容是否切实可行。由于Grails不能一次全部替换,因此一个测试应用程序是用Grails编写的,第二个使用springboot 两者都配置为使用Hibernate 4.

我有一个单一的Web服务,我计划随着时间的推移转换成更小的微服务。该应用程序目前是用Grails编写的,但微服务并不需要Grails提供的所有功能,因此我们的想法是使用一个更轻量级的框架(如果有的话)。为了从数据库中卸载工作,还应使用Hibernate二级缓存

在这一切发生之前,我开始研究分布式/集群缓存和不同的框架,以了解计划的内容是否切实可行。由于Grails不能一次全部替换,因此一个测试应用程序是用Grails编写的,第二个使用springboot

两者都配置为使用Hibernate 4.3.11.Final并定义一个简单的域类/JPA实体

弹簧靴
@实体
@表(name=“gr\U测试\U缓存”)
@可缓存
公共类GrTestCache实现了可序列化{
@身份证
@生成值
长id;
@版本
长版本;
字符串名;
//构造函数、Getter、Setter
}
圣杯
类GrTestCache实现可序列化{
长id
长版本
字符串名
静态映射={
缓存为真
}
}
对于缓存,使用了Hazelcast v3.7.2,当我在不同的机器上运行任一应用程序时,它们共享缓存,因此从app-1上的DB加载一个实体会导致在app-2上从缓存提供相同的请求。但是,这只适用于Spring和Grails应用程序。尝试获取Spring应用缓存的实体会导致Grails应用出错,反之亦然

读取Grails缓存实体时发生Spring错误:

java.lang.IllegalArgumentException: Can not set java.lang.String field GrTestCache.name to java.lang.Long
property.BasicPropertyAccessor HHH000123: IllegalArgumentException in class: GrTestCache, setter method of property: version
property.BasicPropertyAccessor HHH000091: Expected type: long, actual value: java.lang.String
Grails读取Spring缓存实体时出错:

java.lang.IllegalArgumentException: Can not set java.lang.String field GrTestCache.name to java.lang.Long
property.BasicPropertyAccessor HHH000123: IllegalArgumentException in class: GrTestCache, setter method of property: version
property.BasicPropertyAccessor HHH000091: Expected type: long, actual value: java.lang.String
不幸的是,我还没有找到一个解决方案来查看缓存中的数据,但在我看来,虽然域对象似乎是相同的,但这两个应用程序在缓存中存储不同的格式,从而导致反序列化错误

现在的问题是:有没有任何方法可以实现这种互操作性,或者我必须坚持使用所有Grails或所有Spring(或者其他什么…)?手动进行缓存以获得完全控制是不可能的

编辑

正如所要求的,一些DAO代码。我不认为这有什么关系,但给你

弹簧靴 SpTestCacheRepository.java

公共接口SpTestCacheRepository扩展了Crudepository{
}
SpTestCacheService.java

@服务
@交易的
公共类SpTestCacheService{
专用SpTestCacheRepository缓存存储库;
@自动连线
公共SpTestCacheService(SpTestCacheRepository缓存存储库){
this.cacheRepository=cacheRepository;
}
公共GrTestCache testCache(长id){
返回cacheRepository.findOne(id);
}
}
圣杯
@Transactional
类GrTestCacheService{
def FETCHTESTCHE(def参数){
log.trace“->fetchTestCache”
返回GrTestCache.get(params.id)
}
}

你能理解存储库/DAO代码吗?还有一条评论:我不仅对Grails+Spring Boot感兴趣,而且对Grails+“任何其他使用Hibernate的应用程序”更感兴趣。Spring Boot只是我这次测试的首选框架。请尝试将
id
version
类型从
long
更改为
long
。有时,基元类型可能会导致序列化/反序列化机制出现问题。您能支持存储库/DAO代码吗?另一条评论:我不仅对Grails+Spring Boot感兴趣,而且对Grails+“任何其他使用Hibernate的应用程序”更感兴趣。Spring Boot只是我这次测试的首选框架。请尝试将
id
version
类型从
long
更改为
long
。有时,基元类型可能会导致序列化/反序列化机制出现问题