2017-03-24 56 views
0

我的小程序正常終止,如果我不開始交易保存到一個事務。休眠程序仍在運行

public static void main(String[] args){ 
    StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build(); 
    SessionFactory sessionFactory = null;  
    Session session = null; 
    Transaction t = null; 

    try{ 
     sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory(); 
     session = sessionFactory.openSession(); 

     session.beginTransaction(); 
     session.save(new UserInfo("[email protected]", "password2", "erical garb")); 
     t = session.getTransaction(); 
     t.commit(); 
    } 
    catch (Exception e){ 
     System.out.println("Could not create connection!"); 
     e.printStackTrace(); 
    } 
    finally{ 

     DAOUtilities.closeResource(session, "Session"); 
     DAOUtilities.closeResource(sessionFactory, "sessionFactory"); 
     StandardServiceRegistryBuilder.destroy(registry); 

     System.out.println("Session open: " + session.isOpen()); 
     System.out.println("Factory open: " + sessionFactory.isOpen()); 
     System.out.println("Transaction active: " + t.isActive()); 
    } 
} 

打印語句確認session和sessionFactory已成功關閉,並且事務不再處於活動狀態。據我所知,沒有辦法檢查註冊表是否被成功銷燬。下面是輸出...

Hibernate: insert into UserInfo (loggedIn, name, password, email) values (?, ?, ?, ?) 
Mar 24, 2017 12:37:49 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop 
INFO: HHH10001008: Cleaning up connection pool [jdbc:postgresql://localhost:5432/hibernatedb] 
Session open: false 
Factory open: false 
Transaction active: false 

我缺少什麼?任何建議將appriciated,謝謝。

注意:我的數據庫gui正在檢測每次執行的一次會話泄漏,並且更改準確地反映在數據庫中。

+0

您正在使用哪個版本的hibernate? –

+0

休眠5.2.9。它是最新的「穩定」版本。我會嘗試使用舊版本,但我懷疑這是問題所在。 –

回答

0

我發現它存在於我很久以前實現的數據庫驗證函數中的問題。由於開放postgres會議並沒有阻止我的程序終止,我忽略了錯誤。

我實現了一個會話檢漏儀我在https://vladmihalcea.com/the-best-way-to-detect-database-connection-leaks/

發現它給了我一個問題的信心,讓我找到罪魁禍首。我強烈建議在所有使用數據庫的程序中實施這樣的測試。我希望我在開始這個項目時知道這個工具,它會爲我節省很多時間。希望這篇文章能夠幫助他人節省我輸掉的時間。