【发布时间】:2014-07-24 04:52:53
【问题描述】:
我在重新启动 tomcat 时收到 IOException。 我尝试了exception loading sessions from persistent storage中建议的各种解决方案
他们都没有解决问题。
我尝试在 context.xml 中取消注释 <Manager pathname=""/>。没有帮助。
建议的另一个解决方案是使类实现 Serialiable。我不想那样做。
我的目标是让 Tomcat 不保留这些会话。 我正在使用 Tomcat 7.0.54。
以下是堆栈跟踪。请帮忙。
`SEVERE: IOException while loading persisted sessions:
java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: com.comp.cloud.portal.zCompHD
java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: com.comp.cloud.portal.zCompHD
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1354)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)
at java.util.LinkedList.readObject(LinkedList.java:1136)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1017)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1893)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1798)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1990)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1915)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1798)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)
at java.util.HashMap.readObject(HashMap.java:1183)
at sun.reflect.GeneratedMethodAccessor18.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1017)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1893)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1798)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350)
at org.apache.catalina.session.StandardSession.readObject(StandardSession.java:1619)
at org.apache.catalina.session.StandardSession.readObjectData(StandardSession.java:1084)
at org.apache.catalina.session.StandardManager.doLoad(StandardManager.java:282)
at org.apache.catalina.session.StandardManager.load(StandardManager.java:202)
at org.apache.catalina.session.StandardManager.startInternal(StandardManager.java:489)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5476)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
【问题讨论】:
-
"... 如上所述,默认情况下,每个 Web 应用程序都配置了标准管理器实现,并在重新启动时执行会话持久性。要禁用此持久性功能,请为您的 Web 应用程序创建一个上下文配置文件并在那里添加以下元素:
..." - 请参阅 tomcat.apache.org/tomcat-7.0-doc/config/… -
@Leo :如上面的描述中所述,我尝试这样做。没有帮助。为此还能做些什么?
-
无论如何——不管你现在是否想要会话持久化——将不可序列化的东西放到http会话中绝对是个坏主意。这可能表明应用程序设计不佳
-
1) 随着项目的增长,您可能需要集群和会话复制,但您不能 - 您的会话不再可序列化 2) 可能您的不可序列化属性试图将某些东西注入多个使用那个东西的地方。考虑使用 DI 和各种设计模式以获得更好的可读性和便于未来重构。不可序列化的会话称为 J2EE 反模式。例如,请参阅此链接:cwe.mitre.org/data/definitions/579.html
-
Java Servlet 3.0 规范规定,在分布式环境中 (7.2.2) 容器必须接受实现 Serializable 接口的对象。容器可能会选择支持在 HttpSession 中存储其他指定对象,例如对 Enterprise JavaBeans 组件和事务的引用。 而一些框架如 Apache MyFaces 坚持序列化
Sessions。