问题描述
我们正在IBM websphere7上运行的J2EE应用程序中使用推土机映射来映射两个类。 我们将其用作
mapper.map(classA, Class.forName(classB));
它总是可以正常工作,除非非常偶然,它会因ClassCastException失败而失败(两年内在生产中发生一次,在测试区域中每3或4个月发生一次)。 当发生此异常时,我们将继续获取它,直到回收节点为止。 (其他节点当时可以正常工作)。 在检查生成的转储时,我们注意到以下内容。
- 对象(保留)内存已使用100%
- 共享类缓存已满100%
所有其他参数似乎都很好。
我们的假设是,当源类和目标类由不同的类加载器加载时,将发生ClassCastException。
这是一个正确的假设吗? 如果是这样,我们如何确定它(我们当时有堆转储和线程转储)。
还有什么会导致这样的问题?
还有什么需要研究的吗?
有任何可能的解决方案吗?
1楼
如回答
这可能是正确的假设吗? 是的,很有可能,您可以尝试确保像Thread.currentThread()。setContextClassLoader(paramClassLoader);之前那样对类加载器进行压缩。 然后将其重置。
要设置正确的类加载器,请通过org.dozer.util.DozerClassLoader显式设置推土机的类加载器,并设置classB.getClass()。getClassLoader()或在线程上下文中使用mapper.getClass()。getClassLoader()设置classLoader。 不要忘记放回原来的一个,否则您的应用程序会出现CNF异常