2013-05-14 78 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