如果我没有开始交易保存到交易中,我的小程序会正确终止。
e.target.text
print语句确认session和sessionFactory已成功关闭且事务不再处于活动状态。据我所知,没有办法检查注册表是否被成功销毁。这是输出......
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("garb@junkHeap.com", "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());
}
}
我错过了什么?任何建议都会受到批评,谢谢。
注意:我的数据库gui正在检测每次执行一次会话泄漏,并且更改会准确地反映在数据库中。
答案 0 :(得分:0)
我发现很久以前我实施的数据库验证功能存在问题。由于开放的postgres会话并没有阻止我的程序终止,我忽略了错误。
我实现了在https://vladmihalcea.com/the-best-way-to-detect-database-connection-leaks/
找到的会话泄漏检测器它给我的信心让我找到了罪魁祸首。我强烈建议在所有利用数据库的程序中实施此类测试。我希望在我开始这个项目时我已经知道这个工具了,这会给我节省很多时间。希望这篇文章能够为其他人节省我失去的时间。