Spring 弹簧靴&x2B;Grails共享Hibernate二级缓存
我有一个单一的Web服务,我计划随着时间的推移转换成更小的微服务。该应用程序目前是用Grails编写的,但微服务并不需要Grails提供的所有功能,因此我们的想法是使用一个更轻量级的框架(如果有的话)。为了从数据库中卸载工作,还应使用Hibernate二级缓存 在这一切发生之前,我开始研究分布式/集群缓存和不同的框架,以了解计划的内容是否切实可行。由于Grails不能一次全部替换,因此一个测试应用程序是用Grails编写的,第二个使用springboot 两者都配置为使用Hibernate 4.3.11.Final并定义一个简单的域类/JPA实体 弹簧靴Spring 弹簧靴&x2B;Grails共享Hibernate二级缓存,spring,hibernate,caching,grails,Spring,Hibernate,Caching,Grails,我有一个单一的Web服务,我计划随着时间的推移转换成更小的微服务。该应用程序目前是用Grails编写的,但微服务并不需要Grails提供的所有功能,因此我们的想法是使用一个更轻量级的框架(如果有的话)。为了从数据库中卸载工作,还应使用Hibernate二级缓存 在这一切发生之前,我开始研究分布式/集群缓存和不同的框架,以了解计划的内容是否切实可行。由于Grails不能一次全部替换,因此一个测试应用程序是用Grails编写的,第二个使用springboot 两者都配置为使用Hibernate 4.
@实体
@表(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
。有时,基元类型可能会导致序列化/反序列化机制出现问题