2015-06-24 88 views
6

在我的hibernate應用程序中,我寫下了將EmployeeRegistration對象保存到Oracle數據庫的代碼。即使在關閉會話後,Hibernate仍然在oracle數據庫中保持非活動會話

public Integer submitDetails(EmployeeRegistration es) 
{ 
    Session session = factory.openSession(); 
    Transaction tx = null; 
    Integer employeeID = null; 
    try 
    { 
     tx = session.beginTransaction(); 
     employeeID = (Integer)session.save(es); 
     session.flush(); 
     tx.commit(); 
    } 
    catch(HibernateException e) 
    { 
     if(tx != null) 
     { 
      tx.rollback(); 
     } 
     e.printStackTrace(); 
    } 
    finally 
    { 
     if(session.isOpen()) { 
     session.close(); 
     } 
    } 
    return employeeID; 
} 

關閉會話後,它會在oracle db中保留非活動會話。我在oracle中使用下面的查詢檢查了不活動的會話。

SQL> select USERNAME,COUNT(*) FROM V$SESSION WHERE STATUS='INACTIVE' GROUP BY USERNAME ; 

如何通過休眠殺死所有非活動會話。任何人都可以幫助我解決這個問題。

+0

您是否啓用連接池?會話在oracle中定期清理。它可能不是即時的。 – OldProgrammer

+0

不,我在這個應用程序中沒有使用連接池。 – Badal

+0

向我們展示Hibernate配置。 –

回答

1

確保您沒有多次創建sessionFactory

在你finally代碼嘗試以下操作:

if (session != null && session.isOpen()) { 
    session.flush(); 
    session.close(); 
} 

每當你如果需要創建一個新的數據庫連接會話(ES:交易開始)。最好使用連接池來克服這種行爲。

編輯docs

Hibernate自己的連接池算法相當然而簡陋。它旨在幫助您開始使用,不適用於生產系統甚至性能測試。

我建議你處理來自一些問題之前,使用一個連接池定義從庫的創造者簡陋 ...

+0

您是否認爲使用null檢查會話對象並在finally塊內調用flush方法會解決問題,但是之前我嘗試過相同的代碼,但它並沒有幫助我。無論如何,我會再次檢查它。 – Badal

+0

我試過上面的代碼,它解決了這個問題。謝謝:) – Badal

+0

我有同樣的問題,但它不工作:\ –

0

多少活動的會話,你在Oracle數據庫通知這個用戶?

如果您看到一個,那麼它可能與您使用數據庫打開的SQL終端會話有關。

如果您發現它不止一次,並且每次執行代碼時計數都在不斷增加,那麼您並未正確釋放連接。這可能是連接泄漏。

或者它可能確實在使用連接池,而不活動的連接與它所管理的連接有關。這裏無效意味着他們目前沒有執行任何操作。這並不意味着有連接泄漏。發佈你的配置將有助於解決一些問題。 您可以通過生成堆棧跟蹤或通過代碼調試來驗證您是否使用連接池。

此外,請確保沒有其他應用程序使用相同憑據訪問數據庫。

+0

非活動會話計數是不止一個,在配置文件中我已經指定了數據庫細節,方言類和映射類名稱沒有別的,我沒有使用在這個應用程序中的任何連接池機制,如果你會看到我的上面的代碼,我也關閉會議。還有什麼需要做的嗎? – Badal