2013-05-14 183 views
0

休眠是新的,在使用Hibernate的,我遇到IllegaStateException几次,例外是不相符的,因为我不知道会发生什么特定的条件做,有时它从来不会发生,但有时会发生,我无法弄清楚它如何得到解决,请在这方面阐明一些情况。休眠非法状态异常

May 14, 2013 5:32:40 PM org.apache.catalina.loader.WebappClassLoader loadClass 
INFO: Illegal access: this web application instance has been stopped already. Could not load com.mysql.jdbc.ProfilerEventHandlerFactory. The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact. 

java.lang.IllegalStateException 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1600) 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559) 
    at com.mysql.jdbc.ConnectionImpl.realClose(ConnectionImpl.java:4412) 
    at com.mysql.jdbc.ConnectionImpl.close(ConnectionImpl.java:1564) 
    at org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl.stop(DriverManagerConnectionProviderImpl.java:160) 
    at org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl.finalize(DriverManagerConnectionProviderImpl.java:229) 
    at java.lang.ref.Finalizer.invokeFinalizeMethod(Native Method) 
    at java.lang.ref.Finalizer.runFinalizer(Finalizer.java:101) 
    at java.lang.ref.Finalizer.access$100(Finalizer.java:32) 
    at java.lang.ref.Finalizer$FinalizerThread.run 

(Finalizer.java:178) 

这非常令人不安。此外,我正在使用我创建的包装中的一个来处理Sessions和SessionFactory。 此外我检查我的代码我用closeSession()每次我在我的道的使用休眠 api内部使用。

这是我ManagerSessionFactory(包装)

public class ManagerSessionFactory { 

private static SessionFactory sessionFactory; 
private static Configuration configuration; 
protected static ThreadLocal<Session> threadLocal = new ThreadLocal<Session>(); 

static void initializeSessionFactory(String configFilePath) { 
    try { 
     // Create the SessionFactory from standard (hibernate.cfg.xml) 
     // config file. 
     configuration = new Configuration(); 
     sessionFactory = configuration.configure(configFilePath).buildSessionFactory(); 
    } catch (Throwable ex) { 
     // Log the exception. 
     System.err.println("Initial SessionFactory creation failed." + ex.getMessage()); 
     throw new ExceptionInInitializerError(ex); 
    } 
} 

private static SessionFactory getSessionFactory() { 
    return sessionFactory; 
} 

public static Session createSession() { 
    return createSession(null); 
} 

public static Session createSession(String configFilePath) { 

    if (configFilePath == null || configFilePath.trim().equals("")) { 
     configFilePath = "/hibernate.cfg.xml"; 
    } 
    SessionFactory localSessionFactory = ManagerSessionFactory.getSessionFactory(); 
    Session session = ManagerSessionFactory.threadLocal.get(); 

    if (session == null || !session.isOpen()) { 

     if (localSessionFactory == null) { 
      try { 
       ManagerSessionFactory.initializeSessionFactory(configFilePath); 
       localSessionFactory = ManagerSessionFactory.getSessionFactory(); 
      } catch (Exception e) { 
       System.err.println("%%%% Error Creating SessionFactory %%%% " + e.getMessage()); 
      } 
     } 
     session = localSessionFactory.getCurrentSession(); 
     System.out.println("Session Opened......"); 
     ManagerSessionFactory.threadLocal.set(session); 
    } 



    return session; 
} 

public static void closeSession(){ 
    closeSession((Session)ManagerSessionFactory.threadLocal.get()); 
    return; 
} 

public static void closeSession(Session session){ 

    if (session != null && session.isOpen()) { 
     session.close(); 
     //ManagerSessionFactory.threadLocal. 
    } 
    session = null; 

    return; 
} 
} 

这是ManageTransaction,它扩展了以前的类的功能:

public class ManageTransaction extends ManagerSessionFactory { 

private Session session; 
private Transaction transaction; 
private String configFilePath; 
private boolean toStartTransaction; 

public ManageTransaction() { 

    this.session = ManagerSessionFactory.createSession(); 
    initManagerTransaction("", false, session); 
} 

public ManageTransaction(boolean toStartTransaction) { 
    this.session = ManagerSessionFactory.createSession(); 
    if (toStartTransaction) { 
     this.transaction = this.session.getTransaction(); 
     this.transaction = this.transaction.isActive() ? this.transaction : this.session.beginTransaction(); 
    } 
    initManagerTransaction("", toStartTransaction, session); 
} 

public ManageTransaction(boolean toStartTransaction, String configFilePath) { 

    if (toStartTransaction) { 
     this.session = ManagerSessionFactory.createSession(); 
     this.transaction = this.transaction.isActive() ? this.transaction : this.session.beginTransaction(); 
    } 
    initManagerTransaction(configFilePath, toStartTransaction, this.session); 

} 

public ManageTransaction(String configFilePath, boolean toStartTransaction) { 

    ManagerSessionFactory.initializeSessionFactory(configFilePath); 
    if (toStartTransaction) { 
     this.session = ManagerSessionFactory.createSession(); 
     this.transaction = this.transaction.isActive() ? this.transaction : this.session.beginTransaction(); 
    } 
    initManagerTransaction(configFilePath, toStartTransaction, this.session); 
} 

public ThreadLocal<Session> getThreadLocal() { 
    return threadLocal; 
} 

private void initManagerTransaction(String configFilePath, boolean toStartTransaction, Session session) { 
    this.configFilePath = configFilePath == null ? "" : configFilePath; 
    this.toStartTransaction = toStartTransaction; 
    ManageTransaction.threadLocal.set(session); 
} 
public void closeManageTransaction() { 
     afterEveryOperation(true); 
     ManagerSessionFactory.closeSession(this.getSession()); 
    } 

} 

这是我hibernate.cfg。 xml

<hibernate-configuration> 
<session-factory> 
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/befundo?zeroDateTimeBehavior=convertToNull</property> 
    <property name="hibernate.connection.username">root</property> 
    <property name="hibernate.connection.password">root</property> 
    <property name="hibernate.show_sql">false</property> 
    <property name="hibernate.hbm2ddl.auto">update</property> 
    <property name="hibernate.current_session_context_class">thread</property> 
    <!--mapping classes --> 
</session-factory> 
</hibernate-configuration> 

在此先感谢。

+0

您的问题已完成10%您如何期待答案。 提供像你的HibernateUtil等更多的细节 – Makky 2013-05-14 12:20:05

+0

好吧,我给了我的工厂类,负责管理交易和会话,只是保持从核心逻辑外的样板代码... – 2013-05-14 12:32:32

+0

大多数可能你有失踪或混合罐子。 – erencan 2013-05-14 12:33:35

回答

1

我认为问题在于您没有关闭SessonFactory。会话工厂正在创建连接池。当sessionFactory关闭时,这将关闭(释放连接)。由于你没有明确地关闭它,所以当对象被垃圾收集时(finalize方法),close被调用。这是在webapp被部署之后。

一个快速解决方法是添加一个ServletContextListener并关闭会话工厂的销毁方法。

你的代码看起来也很复杂,你会遇到很多问题。最好使用spring或EJB会话bean来处理这个问题。

+0

谢谢你这样一个伟大的想法,我正在学习春天,并很快改变锅炉板代码,以开始与**春** – 2013-05-14 12:58:53