一开始学习hiebernate的时候,首先感觉上手不是很难,比较容易操作,因为一开始是在java应用程序里面运行的,对效率并没有太高的要求,但是在后来部署在web应用的时候发现太可怕了,插入一条数据竟然要30多秒,这样的话很显然是不行的,必须采用优化的方法,不多废话,优化方法如下:
package com.lab507.test;
import java.util.Date;
import java.util.Map;
import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import com.lab507.domain.NlLogs;
import com.lab507.tools.SessionFactoryTools;
import com.opensymphony.xwork2.ActionSupport;
public class test_1Action extends ActionSupport implements RequestAware,SessionAware,ApplicationAware{
private Map<String, Object> request;
private Map<String, Object> session;
private Map<String, Object> application;
@Override
public String execute() throws Exception {
long start=System.currentTimeMillis();
//实例化对象和设置对象属性
NlLogs logs=new NlLogs();
logs.setLoginip("55555");
logs.setLoginname("xuning");
logs.setLogintime(new Date());
logs.setStatus(true);
request.put("starttime", new Date().toString());
//获取sessionfactory,并且显示获取的时间
long startsf=System.currentTimeMillis();
//SessionFactory sessionFactory=SessionFactoryTools.GetSessionFactory();
long endsf=System.currentTimeMillis();
System.out.println("获取sessionfactory用了:"+(endsf-startsf)+"ms");
request.put("getsessionfactorytime", endsf-startsf);
//获取到session,并且显示时间
long starts=System.currentTimeMillis();
Session session=SessionFactoryTools.GetCurrentSession();
long ends=System.currentTimeMillis();
System.out.println("获取session用了:"+(ends-starts)+"ms");
request.put("getsessiontime", ends-ends);
//开始施行后事务。hibernate的dml必须执行事务
session.beginTransaction();
//保存对象
session.save(logs);
//提交事务
session.getTransaction().commit();
//这里不要去关闭sessionfactory和session,因为前者为共用,后者为自动关闭
//session.close();
//关闭sessionfactory
//sessionFactory.close();
long end=System.currentTimeMillis();
//共计用时:
request.put("sumtime", end-start);
return SUCCESS;
}
@Override
public void setApplication(Map<String, Object> arg0) {
// TODO Auto-generated method stub
this.application=arg0;
}
@Override
public void setSession(Map<String, Object> arg0) {
// TODO Auto-generated method stub
this.session=arg0;
}
@Override
public void setRequest(Map<String, Object> arg0) {
// TODO Auto-generated method stub
this.request=arg0;
}
}
然后就是上面有一个工具方法,这个方法的作用是非常大的,可以大大的优化hibernate,是线程共用一个sessionfactory
package com.lab507.tools;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
/*
* 对SessionFactory接口的优化类
*/
public final class SessionFactoryTools {
private static SessionFactory sessionFactory;
private static ThreadLocal<Session> threadLocal=new ThreadLocal<Session>();
private SessionFactoryTools(){
}
static{
sessionFactory=new Configuration().configure().buildSessionFactory();
}
public static SessionFactory GetSessionFactory(){
return sessionFactory;
}
public static Session openSession(){
return sessionFactory.openSession();
}
public static Session GetCurrentSession(){
Session session=threadLocal.get();
if(session==null){
session=sessionFactory.openSession();
threadLocal.set(session);
}
return session;
}
}