当前位置: 首页 > 知识库问答 >
问题:

ehcache 错误序列化密钥,用于与兵马俑服务器进行分布式配置

乔伯寅
2023-03-14

我正在尝试配置兵马俑服务器以使用spring / mybatis应用程序,但我收到以下错误。我不确定这是否意味着密钥本身或从密钥返回的值无法序列化。缓存作为本地缓存工作正常,但现在尝试使用服务器时出现问题。我需要一个线索,为什么这不能被序列化。谢谢。

因此,我从《如何序列化Spring Bean (spring 3)》中得到一个线索,这可能与缺乏会话范围有关。这些错误发生在我启动Tomcat并且加载第一个网页的时候。我将implements java.io.Serializable添加到Site bean类中,这样就可以将错误转移到下一个被调用的bean中。在将它添加到许多beans之后,我想知道这样做是否正确,以及在这些spring类上强制实现java.io.Serializable会有什么副作用吗?B:有没有更好的方法,因为我在这个应用程序中有很多beans?

SEVERE: Servlet.service() for servlet [ezreg] in context with path [] threw exception [Request processing failed; nested exception is net.sf.ehcache.CacheException: The value com.trifecta.src.ezreg.beans.Site@655ad5d5 for key getSiteByHostname127.0.0.1 is not Serializable. Consider using Element.getObjectValue()] with root cause
net.sf.ehcache.CacheException: The value com.trifecta.src.ezreg.beans.Site@655ad5d5 for key getSiteByHostname127.0.0.1 is not Serializable. Consider using Element.getObjectValue()
    at net.sf.ehcache.Element.getValue(Element.java:326)
    at net.sf.ehcache.ElementData.<init>(ElementData.java:35)
    at net.sf.ehcache.EternalElementData.<init>(EternalElementData.java:19)
    at org.terracotta.modules.ehcache.store.ValueModeHandlerSerialization.createElementData(ValueModeHandlerSerialization.java:48)
    at org.terracotta.modules.ehcache.store.ClusteredStore.doPut(ClusteredStore.java:745)
    at org.terracotta.modules.ehcache.store.ClusteredStore.putInternal(ClusteredStore.java:291)
    at org.terracotta.modules.ehcache.store.ClusteredStore.put(ClusteredStore.java:263)
    at org.terracotta.modules.ehcache.store.ClusteredSafeStore.put(ClusteredSafeStore.java:247)
    at org.terracotta.modules.ehcache.store.nonstop.NonStopStoreWrapper.put(NonStopStoreWrapper.java:820)
    at net.sf.ehcache.Cache.putInternal(Cache.java:1617)
    at net.sf.ehcache.Cache.put(Cache.java:1543)
    at net.sf.ehcache.Cache.put(Cache.java:1508)
    at org.springframework.cache.ehcache.EhCacheCache.put(EhCacheCache.java:121)
    at org.springframework.cache.interceptor.AbstractCacheInvoker.doPut(AbstractCacheInvoker.java:85)
    at org.springframework.cache.interceptor.CacheAspectSupport$CachePutRequest.apply(CacheAspectSupport.java:784)
    at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:417)
    at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:327)
    at org.springframework.cache.interceptor.CacheInterceptor.invoke(CacheInterceptor.java:61)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)
    at com.sun.proxy.$Proxy56.getSiteByHostname(Unknown Source)
    at com.trifecta.src.ezreg.daos.SiteDaoImpl.getSiteByHostname(SiteDaoImpl.java:35)


doa method:
    public Site getSiteByHostname(String hostname) {        
        return getSiteMapper().getSiteByHostname(hostname);
    }

映射器方法:

@Cacheable(cacheNames="siteCache", key="#root.methodName.concat(#root.args)")
Site getSiteByHostname(String hostname);

返回的站点bean:

package com.trifecta.src.ezreg.beans;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

@XmlRootElement
public class Site {
    public static String ADMIN_CURRENT_SITE = "adminCurrentSite";
    public static String _CURRENT_SITE = "currentSite";

    @XmlAttribute
    private Long id;

    @XmlAttribute
    private String name;

    @XmlAttribute
    private String supportphonenumber;

    @XmlElement
    private SitePreference sitePreference;

    @XmlElement
    private SiteInterfaceDevice siteInterfaceDevice;

    @XmlElement
    private SitePdfFormat sitePdfFormat;

    @XmlAttribute
    private boolean ecum; 

    @XmlTransient
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    @XmlTransient
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @XmlTransient
    public SiteInterfaceDevice getSiteInterfaceDevice() {
        return siteInterfaceDevice;
    }
    public void setSiteInterfaceDevice(SiteInterfaceDevice siteInterfaceDevice) {
        this.siteInterfaceDevice = siteInterfaceDevice;
    }
    @XmlTransient
    public SitePdfFormat getSitePdfFormat() {
        return sitePdfFormat;
    }
    public void setSitePdfFormat(SitePdfFormat sitePdfFormat) {
        this.sitePdfFormat = sitePdfFormat;
    }
    @XmlTransient
    public SitePreference getSitePreference() {
        return sitePreference;
    }
    public void setSitePreference(SitePreference sitePreference) {
        this.sitePreference = sitePreference;
    }
    @XmlTransient
    public String getSupportphonenumber() {
        return supportphonenumber;
    }
    public void setSupportphonenumber(String supportphonenumber) {
        this.supportphonenumber = supportphonenumber;
    }
    @XmlTransient
    public boolean getEcum() {
        return ecum;
    }
    public void setEcum(boolean ecum) {
        this.ecum = ecum;
    }
}


public class Site implements java.io.Serializable{
    public static String ADMIN_CURRENT_SITE = "adminCurrentSite";
    public static String _CURRENT_SITE = "currentSite";

共有1个答案

郭皓
2023-03-14

在本地缓存时,您可以只使用堆内存进行设置,因此对存储在缓存中的键/值没有要求。

然而,当您移动到集群或实际上是堆以外的任何其他缓存层时,您的键和值必须实现<code>可序列化

在您的示例中,类型显然是com.trifecta.src.ezreg.beans。站点不实现可序列化的。

您有两种选择:

    < li >将类型定义更新为< code > implement Serializable ,并确保它为true -即它只具有< code>Serializable字段 < li >将不可序列化的值转换为可序列化的值。

请注意,使用Ehcache 3,您可以选择为您的类型指定一个定制的序列化程序,而不会限制您使用Java序列化。

 类似资料:
  • 我发现了很多展示如何在Spring Boot应用程序中集成Ehcache的例子,例如这里所描述的。就我对这个例子的理解,Ehcache本身是运行在Spring应用程序中的。 然而,我们的设置提供了一个Terracotta服务器作为“中央”缓存实例。不幸的是,到目前为止我还没有找到任何文档,如何告诉我的Spring Boot应用程序使用远程Terracotta服务器作为Ehcache。 你有什么例子

  • 我在系统中运行了2/3个Java/Spring引导应用程序。我想使用通用存储,以便其他Java应用程序也可以使用任何其他Java /Spring启动应用程序生成的缓存。 我可以使用公共磁盘库在内存中创建ecache吗? 或者我应该在我的机器上运行独立的ehcache 所以,据我所知,看起来如果我们需要在服务器中运行,它应该在Terracotta服务器中。 但是,我更希望集中缓存,以便其他应用程序可

  • 我在我的应用程序中使用了maven、hibernate3、struts和spring,并成功地使用了ehcache。缓存是在本地完成的,现在我想要分布式。我找不到一个很好的教程,它一步一步地解释了如何使用ehcache和terracotta进行分发。 帮助将不胜感激。 谢啦

  • 我正在尝试将我的应用程序连接到 Terracotta 缓存群集,但我在使用我设置的配置启动应用程序时遇到问题。我在控制台中没有收到任何错误,但是如果我进行调试,则在尝试创建缓存管理器时会失败。 我得到的错误是这个。原因: java.lang.ClassNotfundException: net.sf.ehcache.config.TerracottaConfig配置 我正在使用冬眠4.x,Spri

  • 我们在Grails环境中配置了ehcache,我正在尝试确定如何使用远程terracotta缓存配置本地缓存。 这个场景是,我们有一些计算成本最低的数据,并受益于本地内存缓存,但当使用远程terracotta缓存时,这种好处被最小化了。 配置目前非常简单: 问题是: > 鉴于上面的配置,这是否意味着缓存放置/获取将始终往返于兵马俑服务器? 在往返服务器之前,是否有可能使用本地“热”缓存的配置? 如

  • 我想在不同的 VM 上配置 Ehcache 实例,并在主机上运行 servlet,将这些缓存用作数据存储。缓存服务器必须形成一个集群,用于分布式缓存。 我搜索了任何地方(谷歌、stackoverflow、Ehachep留档)。但是,我找不到任何足够的“如何”文章。此外,我不可能使用企业产品(Terracotta BigMemory等)。 可以随意假设元素包含如上所述的客户信息。我只需要知道如何通过