Hibernate与Jdbc的效率测试(ZT)

首先,建数据库表,采用MySQL数据库。

CREATE TABLE `t_jobstat` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `jobNo` varchar(45) DEFAULT NULL,
  `clickSum` int(10) unsigned DEFAULT NULL,
  `showSum` int(10) unsigned DEFAULT NULL,
  `mailSum` int(10) unsigned DEFAULT NULL,
  `locationid` varchar(10) DEFAULT NULL,
  `logdate` char(8) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=7320077 DEFAULT CHARSET=gbk MAX_ROWS=500000000;

其次,插入大批量数据,本次测试,插入730万条数据。

 

一.Jdbc测试

主要方法如下:

1.数据访问层

Java代码 复制代码
  1.    /**  
  2.  * 检索前1000条记录  
  3.  * @return  
  4.  * @throws SQLException  
  5.  */  
  6. public List<Jobstat> findAll() throws SQLException {   
  7.     String sql = "select * from t_jobstat where locationid like '%530%' limit 0,1000 ";   
  8.   
  9.     // 执行查询   
  10.     ps = conn.prepareStatement(sql);   
  11.     ResultSet rs = ps.executeQuery();   
  12.   
  13.     // 将查询结果组装至Asset实体对象   
  14.     Jobstat jobstat = null;   
  15.     List<Jobstat> list = new ArrayList<Jobstat>();   
  16.        
  17.     while (rs.next()) {   
  18.         jobstat = new Jobstat();   
  19.         jobstat.setId(rs.getInt("id"));   
  20.         jobstat.setJobNo(rs.getString("jobNo"));   
  21.         jobstat.setClickSum(rs.getInt("clickSum"));   
  22.         jobstat.setShowSum(rs.getInt("showSum"));   
  23.         jobstat.setMailSum(rs.getInt("mailSum"));   
  24.         jobstat.setLocationId(rs.getString("locationId"));   
  25.         jobstat.setLogdate(rs.getString("logdate"));   
  26.         list.add(jobstat);   
  27.         jobstat = null;   
  28.     }   
  29.        
  30.     return list;   
  31. }  
    /**
	 * 检索前1000条记录
	 * @return
	 * @throws SQLException
	 */
	public List<Jobstat> findAll() throws SQLException {
		String sql = "select * from t_jobstat where locationid like '%530%' limit 0,1000 ";

		// 执行查询
		ps = conn.prepareStatement(sql);
		ResultSet rs = ps.executeQuery();

		// 将查询结果组装至Asset实体对象
		Jobstat jobstat = null;
		List<Jobstat> list = new ArrayList<Jobstat>();
		
		while (rs.next()) {
			jobstat = new Jobstat();
			jobstat.setId(rs.getInt("id"));
			jobstat.setJobNo(rs.getString("jobNo"));
			jobstat.setClickSum(rs.getInt("clickSum"));
			jobstat.setShowSum(rs.getInt("showSum"));
			jobstat.setMailSum(rs.getInt("mailSum"));
			jobstat.setLocationId(rs.getString("locationId"));
			jobstat.setLogdate(rs.getString("logdate"));
			list.add(jobstat);
			jobstat = null;
		}
		
		return list;
	}

2.Action层

  

Java代码 复制代码
  1.              /**  
  2.      * 检索前1000条记录  
  3.      * @param mapping  
  4.      * @param form  
  5.      * @param request  
  6.      * @param response  
  7.      * @return  
  8.      * @throws Exception  
  9.      */  
  10.     public ActionForward findTop(ActionMapping mapping, ActionForm form,   
  11.             HttpServletRequest request, HttpServletResponse response) throws Exception{   
  12.   
  13.         JobstatDAO dao = new JobstatDAO();   
  14.         long start = System.currentTimeMillis();   
  15.         List<Jobstat>list = dao.findAll();   
  16.         request.setAttribute("results", list);   
  17.         long end = System.currentTimeMillis();   
  18.         System.out.println("取出前1000条数据组装为对象,花费时间为"+(end-start)+"ms");   
  19.         return mapping.findForward("top");   
  20. }  
             /**
	 * 检索前1000条记录
	 * @param mapping
	 * @param form
	 * @param request
	 * @param response
	 * @return
	 * @throws Exception
	 */
	public ActionForward findTop(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws Exception{

    	JobstatDAO dao = new JobstatDAO();
    	long start = System.currentTimeMillis();
        List<Jobstat>list = dao.findAll();
        request.setAttribute("results", list);
        long end = System.currentTimeMillis();
        System.out.println("取出前1000条数据组装为对象,花费时间为"+(end-start)+"ms");
        return mapping.findForward("top");
}

 3.我们打开一个测试页面,http://localhost:8080/jdbctest/jobstat.do?p=findTop

 然后将默认浏览器设为能打开多Tab页的遨游,狂点测试页,最后数据取出速度稳定在16ms左右。

 

二.Hibernate  Test

1.DAO访问层

Java代码 复制代码
  1. public static void main(String[] args) throws UnsupportedEncodingException{   
  2.     session = HibernateUtil.currentSession(); // 开启连接   
  3.     long start = System.currentTimeMillis();   
  4.     String queryString = "from Jobstat as js";   
  5.     Query queryObject = session.createQuery(queryString);   
  6.     int pageNo =0;   
  7.     pageNo = new Random().nextInt(10);   
  8.     queryObject.setFirstResult(1000*pageNo);   
  9.     queryObject.setMaxResults(1000*(pageNo+1));   
  10.     List list = queryObject.list();   
  11.     long end = System.currentTimeMillis();   
  12.     System.out.println("随机取出前1000条数据组装为对象,花费时间为"+(end-start)+"ms");   
  13. }  
	public static void main(String[] args) throws UnsupportedEncodingException{
		session = HibernateUtil.currentSession(); // 开启连接
		long start = System.currentTimeMillis();
		String queryString = "from Jobstat as js";
		Query queryObject = session.createQuery(queryString);
		int pageNo =0;
		pageNo = new Random().nextInt(10);
     queryObject.setFirstResult(1000*pageNo);
     queryObject.setMaxResults(1000*(pageNo+1));
     List list = queryObject.list();
     long end = System.currentTimeMillis();
     System.out.println("随机取出前1000条数据组装为对象,花费时间为"+(end-start)+"ms");
	}

2进行数据量测试,当数据库中未建主键测试中,取出1000条数据花费时间为680ms,当主键索引存在后,取出1000条数据花费时间为530ms

 

综上测试,

 Hibernate作为一个O/R Mapping,比JDBC具备的优势有:

1.编程思想上,更加符合人的逻辑思维习惯,面向对象比面向过程更加容易理解,测试和维护

2.开发维护速度上,Hibernate显著的快,代码量显著小

3.通过Annotation进行数据库的字段加密

4.对Sql不熟的菜鸟来说可以自动调优

5.结合Spring,通过声明式事务可以省略事务的控制,事务以横切面形式出现

 

Jdbc比Hibernate具备的优势有:

1.大数据量访问时,Jdbc的效率显著快

2.直接操作数据库比较灵活

 

Hibernate比Jdbc慢的地方:

1.将Hql语句转化为标准Sql语句,花费时间可以忽略不急

2.将ResultSet中数据组装为实体对象,如果即所得数据量比较大(比如一次检索1000条数据),这是效率就会降低,在组装实体对象花费时间较长

 

检索单表的1000条数据,Hibernate与Jdbc均不会超过1S钟.

 

from: http://www.iteye.com/topic/236784

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值