tomcat restart => 找不到 SessionFactory [uuid=...,name=null]

Posted

技术标签:

【中文标题】tomcat restart => 找不到 SessionFactory [uuid=...,name=null]【英文标题】:tomcat restart => Could not find a SessionFactory [uuid=...,name=null] 【发布时间】:2012-07-01 16:40:29 【问题描述】:

继续解决this situation,我已经更新了hibernate ond sqljdbc4 jars,现在异常已更改(请看下面)。

我正在使用

休眠 v4.1.4 最终版 JSF 2.1 (mojarra) 我所有的@ManagedBeans implements Serializable

它与@ViewScoped 有一些关系,因为@SessionScoped bean 是可以的

我的尝试:

启用<Manager pathname=""/> in context.xml,是的,异常消失了,但是我确实失去了持久会话,所以我必须在tomcat服务器重启后重新登录。

在 hibernate.cfg.xml 文件中进行更改(例如,将 name="java:hibernate/SessionFactory" 添加到 <session-factory> 标签),但没有成功

使用SESSIONS.ser 文件,该文件是在 STOP tomcat 服务器之后创建的。

当我打开 ser 文件时,我可以找到类似的内容: .... uuidq ~ xppt $e8906373-f31b-4990-833c-c7680b2a77ce ... 如果我再次START tomcat 服务器,它会报告Could not find a SessionFactory [uuid=8906373-f31b-4990-833c-c7680b2a77ce,name=null] - WHY???会话似乎存在于SESSION.ser 文件中...李>

我的会话管理员:

@SessionScoped
@ManagedBean(name="userManager")
public class UserManager implements Serializable 
  private static final long serialVersionUID = 1L;
  private transient HttpSession session;
  private String username;
  private String password;
  private User user;

  public String login() 
    // here is seraching for user in database (based on username and password)

    if (user != null) 
      FacesContext context = FacesContext.getCurrentInstance();
      session = (HttpSession) context.getExternalContext().getSession(true);
      session.setAttribute("id", user.getId());
      session.setAttribute("username", user.getName());
      ...
      return "success";
     
  

  public String logout() 
    user = null;
    FacesContext context = FacesContext.getCurrentInstance();
    session = (HttpSession) context.getExternalContext().getSession(true);
    ...     
    session.invalidate();
    return "success";
  
  // getters and setters ----------------------------------------------------

我的hibernate.cfg.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC 
  "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
 <session-factory>
  <property name="connection.url">jdbc:sqlserver://localhost;databaseName=RXP</property>
  <property name="connection.username">user</property>
  <property name="connection.password">password</property>
  <property name="connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
  <property name="dialect">org.hibernate.dialect.SQLServer2008Dialect</property>
  <property name="current_session_context_class">thread</property>
  <property name="hibernate.show_sql">true</property>
  <property name="hibernate.hbm2ddl.auto">update</property>

  <mapping class="tables.User"/>

 </session-factory>
</hibernate-configuration>

还有我的会话工厂

public final class DaoSF implements Serializable 
  private static final long serialVersionUID = 1L;

  private static SessionFactory sessionFactory;
  private static ServiceRegistry serviceRegistry;

  public static SessionFactory getSessionFactory() 
    try 
      Configuration configuration = new Configuration();
      configuration.configure("hibernate.cfg.xml");
      serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();        
      sessionFactory = configuration.buildSessionFactory(serviceRegistry);
      return sessionFactory;
    
    catch (HibernateException he)  
      ...
    
  

例外

30.6.2012 13:29:07 org.apache.catalina.session.StandardManager doLoad
SEVERE: IOException while loading persisted sessions: java.io.InvalidObjectException: Could not find a SessionFactory [uuid=f9c33312-cf7f-4f65-ae5f-44261705c18e,name=null]
java.io.InvalidObjectException: Could not find a SessionFactory [uuid=f9c33312-cf7f-4f65-ae5f-44261705c18e,name=null]
    at org.hibernate.internal.SessionFactoryImpl.locateSessionFactoryOnDeserialization(SessionFactoryImpl.java:2007)
    at org.hibernate.internal.SessionFactoryImpl.deserialize(SessionFactoryImpl.java:2037)
....

我尝试用这种方式编辑我的hibernate.cfg.xml 文件:

<session-factory name="java:hibernate/SessionFactory">

并且报错已经改为:

30.6.2012 13:38:23 org.apache.catalina.session.StandardManager startInternal
SEVERE: Exception loading sessions from persistent storage
java.lang.NullPointerException
    at java.util.concurrent.ConcurrentHashMap.get(Unknown Source)
    at org.hibernate.internal.SessionFactoryRegistry.getSessionFactory(SessionFactoryRegistry.java:140)
    at org.hibernate.internal.SessionFactoryRegistry.getNamedSessionFactory(SessionFactoryRegistry.java:135)
    at org.hibernate.internal.SessionFactoryImpl.locateSessionFactoryOnDeserialization(SessionFactoryImpl.java:2000)
    at org.hibernate.internal.SessionFactoryImpl.deserialize(SessionFactoryImpl.java:2037)
....

您没有遇到过这种错误报告吗?

【问题讨论】:

您是否将 Hibernate 会话分配为视图/会话范围的托管 bean 的属性?这真是一个奇怪的设计,但这个例外表明了这一点。 BalusC,你能看看我更新的问题,主要是关于 SER 文件的部分吗?好像没问题,但不是:( @gaffcz:您不希望 Session、SessionFactory 或 DaoSF 的实例被序列化。它们是暂时的,无法从文件中恢复。你最好首先弄清楚它们在哪里以及为什么被序列化到一个文件中。这就是你需要修复的地方。 @Codo:你说得对,我检查了这么久,现在我所有的类都可以序列化了。再过几分钟,我将开始尝试序列化 js 和 css 文件:-P 谢谢,我会考虑的 @Codo:您的建议对我帮助很大。 UserManager 似乎不必序列化!我会试试的,异常消失了!如果你愿意,请回答我的问题,我会接受的 【参考方案1】:

您不希望 SessionSessionFactoryDaoSF 的实例被序列化。它们是暂时的,无法从文件中恢复。你最好首先弄清楚它们在哪里以及为什么被序列化到一个文件中。这就是你需要修复的地方。

【讨论】:

【参考方案2】:

另外一个功能是更新tomcat/conf/下的context.xml,具体如下:

   <Manager className="org.apache.catalina.session.PersistentManager" saveOnRestart="false"   maxActiveSessions="-1" minIdleSwap="-1" maxIdleSwap="-1" maxIdleBackup="-1">
   <Store className="org.apache.catalina.session.FileStore"/>
   </Manager>

【讨论】:

提示:使用编辑器中的格式化工具突出显示您的代码。因此,您的代码不可见。

以上是关于tomcat restart => 找不到 SessionFactory [uuid=...,name=null]的主要内容,如果未能解决你的问题,请参考以下文章

conda jupyter 报错 ImportError: DLL load failed: 找不到指定的模块。ernelRestarter: restart failed。

tomcat端口被占用怎么解决,进程里找不到

Idea 找不到tomcat server 服务器选项

eclipse部署web项目至本地tomcat, webapps中找不到

个人问题:解决eclipse配置Tomcat时找不到server选项

Eclipse的server选项卡中找不到tomcat配置项