Hibernate的优化初步

一开始学习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;
	}
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章