2017-03-24 39 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/

发现它给了我一个问题的信心,让我找到罪魁祸首。我强烈建议在所有使用数据库的程序中实施这样的测试。我希望我在开始这个项目时知道这个工具,它会为我节省很多时间。希望这篇文章能够帮助他人节省我输掉的时间。