【问题标题】:Running Tomcat in Eclipse and getting "Exception loading sessions from persistent storage"在 Eclipse 中运行 Tomcat 并获取“来自持久存储的异常加载会话”
【发布时间】:2014-02-06 13:13:44
【问题描述】:

我使用 Eclipse Kepler 开发基于 Sprig/Hibernate/PostgreSQL 的应用程序。该应用程序在由 Eclipse 管理的 Tomcat 中运行。这通常工作正常。

在修改和保存任何 jsp 大约 10 次后,我得到以下异常:

2014 年 1 月 17 日上午 9:53:33 org.apache.catalina.core.StandardContext 重新加载 信息:使用名称 [/app] 重新加载上下文已开始 2014 年 1 月 17 日上午 9:53:33 org.apache.catalina.core.ApplicationContext 日志 信息:销毁 Spring FrameworkServlet 'dispatcherServlet' 2014 年 1 月 17 日上午 9:53:33 org.apache.catalina.core.ApplicationContext 日志 信息:关闭 Spring 根 WebApplicationContext [调试] [ContainerBackgroundProcessor[StandardEngine[Catalina]] 17.01.14 09:53:33] (Utils.java:logSystemState:365) 系统信息:活动会话:1,可用处理器:8,最大内存:1754 MB,总内存:658 MB , freeMemory: 110 MB, loadAverage: 0.11 [DEBUG] [ContainerBackgroundProcessor[StandardEngine[Catalina]] 17.01.14 09:53:33] (LifeCycle.java:destroy:89) APP 1.1.4(建于 Fri, 17.01.2014, 09:55),销毁于 /应用程序,在目标环境“开发”上运行。正常运行时间:1 小时 4 分钟 7 秒 314 毫秒。春季:3.2.6.RELEASE,休眠:4.2.8.Final 2014 年 1 月 17 日上午 9:53:33 org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc 严重:Web 应用程序 [/app] 注册了 JDBC 驱动程序 [org.postgresql.Driver] 但在 Web 应用程序停止时未能取消注册。为防止内存泄漏,已强制注销 JDBC 驱动程序。 2014 年 1 月 17 日上午 9:53:36 org.apache.catalina.core.ApplicationContext 日志 信息:在类路径上未检测到 Spring WebApplicationInitializer 类型 2014 年 1 月 17 日上午 9:53:36 org.apache.catalina.core.ApplicationContext 日志 信息:初始化 Spring 根 WebApplicationContext ... 2014 年 1 月 17 日上午 9:53:37 org.apache.catalina.session.StandardManager startInternal 严重:来自持久存储的异常加载会话 java.lang.ClassNotFoundException:com.mycompany.app.spring.AuthenticationWrapper 在 org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1714) 在 org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559) 在 java.lang.Class.forName0(本机方法) 在 java.lang.Class.forName(Class.java:270) 在 org.apache.catalina.util.CustomObjectInputStream.resolveClass(CustomObjectInputStream.java:76) 在 java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1610) 在 java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1515) 在 java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1769) 在 java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1348) 在 java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1989) 在 java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1913) 在 java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1796) 在 java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1348) 在 java.io.ObjectInputStream.readObject(ObjectInputStream.java:370) 在 org.apache.catalina.session.StandardSession.readObject(StandardSession.java:1595) 在 org.apache.catalina.session.StandardSession.readObjectData(StandardSession.java:1060) 在 org.apache.catalina.session.StandardManager.doLoad(StandardManager.java:284) 在 org.apache.catalina.session.StandardManager.load(StandardManager.java:204) 在 org.apache.catalina.session.StandardManager.startInternal(StandardManager.java:491) 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 在 org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5443) 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 在 org.apache.catalina.core.StandardContext.reload(StandardContext.java:3954) 在 org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:426) 在 org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1345) 在 org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1530) 在 org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1540) 在 org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1540) 在 org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1519) 在 java.lang.Thread.run(Thread.java:724) 2014 年 1 月 17 日上午 9:53:37 org.apache.catalina.core.StandardContext startInternal 严重:由于先前的错误,上下文 [/app] 启动失败 2014 年 1 月 17 日上午 9:53:37 org.apache.catalina.core.ApplicationContext 日志 信息:关闭 Spring 根 WebApplicationContext 2014 年 1 月 17 日上午 9:53:37 org.apache.catalina.core.StandardContext 重新加载 信息:重新加载名称为 [/app] 的上下文已完成

解决这个问题的唯一方法是停止 Tomcat,执行Project->Clean,然后重新启动 Tomcat。当然会话丢失了,我必须重新登录应用程序。

这个问题严重影响了我的开发工作流程,到目前为止我还没有找到解决办法。

怀疑是文件系统问题,我尝试在 tmpfs 中创建一个文件夹并将其用作 Tomcat 的服务器路径(在 Eclipse 中设置),但它没有改变任何东西。

请注意,这仅发生在我的笔记本电脑(Kubuntu 13.10)上,一位同事使用相同的笔记本电脑和相同的操作系统,但没有发现问题。

似乎问题在于文件系统上的会话已损坏,而 Tomcat 对此感到窒息。为什么会这样?

【问题讨论】:

    标签: java eclipse tomcat


    【解决方案1】:

    消除此错误的一种方法是在重新启动时禁用会话持久性。您可以通过编辑文件 CATALINA_HOME/conf/context.xml 并将<Manager> 的路径名属性设置为空字符串来完成此操作。

    您还应该在 Tomcat 关闭时从 CATALINA_HOME/work/Catalina/localhost/ 文件夹中删除所有旧的 session.ser 文件。

    发生这种情况可能是因为 Tomcat 没有完全关闭,因此会话对象在序列化过程中被损坏。

    【讨论】:

    • 肯定会让错误消失。但从某种意义上说,“如果您不喜欢排气管破裂的噪音,就不要开车” :-) 我正在寻找真正解决该错误的方法。我有第二台笔记本电脑,我使用相同的设置(只有发行版是 Fedora),但从未发生过。
    • 没有什么比从另一个线程复制答案 - Raj - 在这里查看stackoverflow.com/questions/20622746/… 如果您需要会话持久性,那里可能有更多建议...我没有标记为重复,因为您正在寻找调试也提供建议(不仅仅是解决方法)
    • 这样你只是隐藏了错误。并且可能会推迟一个严重的问题。
    猜你喜欢
    • 1970-01-01
    • 2014-01-04
    • 2013-04-07
    • 2016-11-13
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多