休眠程序未终止
时间:2020-02-23 14:41:53 来源:igfitidea点击:
最近,我正在编写一个小的休眠程序,并注意到即使成功执行了main方法,该程序也没有终止。
我正在使用Hibernate最新版本4.3.5.Final。
休眠程序未终止程序
我的示例类代码如下所示。
package com.theitroad.hibernate.main; import java.util.Date; import org.hibernate.Session; import org.hibernate.SessionFactory; import com.theitroad.hibernate.model.Employee1; import com.theitroad.hibernate.util.HibernateUtil; public class HibernateMain { public static void main(String[] args) { Employee1 emp = new Employee1(); emp.setName("Lisa"); emp.setRole("Manager"); emp.setInsertTime(new Date()); //Get Session SessionFactory sessionFactory = HibernateUtil.getSessionFactory(); Session session = sessionFactory.getCurrentSession(); //start transaction session.beginTransaction(); //Save the Model object session.save(emp); //Commit transaction session.getTransaction().commit(); System.out.println("Employee ID="+emp.getId()); } }
以上代码的问题在于,Hibernate不会释放资源,一旦完成,我们有责任释放资源。
如您所见,在上面的程序中,ServiceManager
实例已创建但未关闭。
因此,我将程序更改为以下代码,并且在执行main方法后程序开始终止。
package com.theitroad.hibernate.main; import java.util.Date; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import com.theitroad.hibernate.model.Employee1; import com.theitroad.hibernate.util.HibernateUtil; public class HibernateMain { public static void main(String[] args) { Employee1 emp = new Employee1(); emp.setName("Lisa"); emp.setRole("Manager"); emp.setInsertTime(new Date()); SessionFactory sessionFactory = null; Session session = null; Transaction transaction = null; try{ //Get Session sessionFactory = HibernateUtil.getSessionFactory(); session = sessionFactory.getCurrentSession(); //start transaction transaction = session.beginTransaction(); //Save the Model object session.save(emp); //Commit transaction transaction.commit(); System.out.println("Employee ID="+emp.getId()); }catch(Exception e){ System.out.println("Exception occured. "+e.getMessage()); }finally{ if(session.isOpen()){ System.out.println("Closing session"); session.close(); } if(!sessionFactory.isClosed()){ System.out.println("Closing SessionFactory"); sessionFactory.close(); } } } }
请注意,我正在finally块中关闭资源,因此,即使应用程序抛出任何异常,所有资源也会被释放。