我有一个为我们的门户网站新开发的缓存框架,将由门户网站上的许多应用程序使用。当堆大小超过某个限制时,我们将缓存的条目持久化到数据库。
在持久化之前,我们将序列化CachedObject,然后存储到数据库中。
public class CachedObject implements Serializable{
private Object obj = null;
public CachedObject(){
}
public CachedObject(Object obj) {
this.obj = obj;
}
}
上面是我的CachedObject表示,obj是放入缓存的实际对象。假设obj的类型为TestPojo.java,它位于相应应用程序的web-inf / lib中。 此TestPojo.java由应用程序类加载器加载。
新开发的缓存框架jar(比如cache.jar)驻留在IBM Websphere服务器的JVM类路径中,并由ExtJarClassLoader加载。
我能够序列化缓存的对象并完美地保存到数据库中,但是当我 DE序列化保存在数据库中的对象我得到ClassNotFoundException,因为所需的TestPojo.java在JVM类路径级别没有可见性(cache.jar所在的位置,这里发生了序列化)。
我知道如果我可以将cache.jar移动到应用程序类加载器级别,问题就会得到解决。但是,我不能这样做,因为在jvm类路径中有其他jar使用了这个cache.jar。
请建议是否有其他解决方案来解决此类加载问题..通过更改Web范围应用程序服务器级别的配置或@ java代码的任何其他工作。
我还尝试了不同的方法,将应用程序的类加载委派模式更改为parent_first,parent_last,但我得到了相同的序列化问题。
答案 0 :(得分:0)
您的缓存框架不应使用自己的类加载器进行反序列化,而应使用应用程序。因此,对于每个应用程序,您需要跟踪要使用的类加载器。
另请参阅JSR107缓存标准的API,该标准也需要解决此问题。可以通过CachingProvider使用特定的类加载器检索CacheManager。