休眠程序未终止
时间: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块中关闭资源,因此,即使应用程序抛出任何异常,所有资源也会被释放。

