`
alfredgao
  • 浏览: 137954 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

Hibernate与Jdbc的效率测试

阅读更多

首先,建数据库表,采用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.数据访问层

    /**
	 * 检索前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层

  

             /**
	 * 检索前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访问层

	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钟.

 

分享到:
评论
6 楼 rainerWJY 2008-09-04  
alfredgao 写道
@rainerWJY
jdbc也会去封装的 cache不是只有hibernate有

对,这位仁兄说的很对,Jdbc的封装除了手动封装之外,还可以通过其他工具类进行反射封装,目的就在与测试反射装配实体Bean的效率如何。
Cache的确其他的O/R mapping有。

@sinostone
这完全要看项目要求了

赞同,感觉数量访问不是很大的都可以使用Hibernate提高开发效率;而Jdbc则适合做数据量交互大的系统。

@laiseeme
这个貌似每隔一段时间就有人发hibernate贴证明他性能低下的

Hibernate确实相较于Jdbc有性能方面的损失,做测试的目的是明确技术的适用范围。

@lzmhehe
还在做这种测试,有何意义

请问这位仁兄如何进行技术选型?


最近在看cglib 目前来说这种实现必然是最快的,他等于用java的方法从新模拟了整个调用javaclass的过程,自然是想cache哪儿就cache哪儿,还能动态添加方法等,无他。这个最快。
你做orMapping 想要速度必然是cglib。cache选型就很多了。hibernate并不一定适合所有应用
5 楼 alfredgao 2008-09-04  
@rainerWJY
jdbc也会去封装的 cache不是只有hibernate有

对,这位仁兄说的很对,Jdbc的封装除了手动封装之外,还可以通过其他工具类进行反射封装,目的就在与测试反射装配实体Bean的效率如何。
Cache的确其他的O/R mapping有。

@sinostone
这完全要看项目要求了

赞同,感觉数量访问不是很大的都可以使用Hibernate提高开发效率;而Jdbc则适合做数据量交互大的系统。

@laiseeme
这个貌似每隔一段时间就有人发hibernate贴证明他性能低下的

Hibernate确实相较于Jdbc有性能方面的损失,做测试的目的是明确技术的适用范围。

@lzmhehe
还在做这种测试,有何意义

请问这位仁兄如何进行技术选型?
4 楼 lzmhehe 2008-09-04  
还在做这种测试,有何意义
3 楼 laiseeme 2008-09-04  
这个貌似每隔一段时间就有人发hibernate贴证明他性能低下的
2 楼 sinostone 2008-09-04  
这完全要看项目要求了
1 楼 rainerWJY 2008-09-04  
没什么意义的测试
jdbc也会去封装的 cache不是只有hibernate有

相关推荐

    hibernate和jdbc测试

    对于性能测试,可以比较使用JDBC和Hibernate执行相同任务的时间消耗,评估哪种方式更高效。同时,要关注内存使用情况,因为ORM框架可能会增加内存开销。 在进行测试时,使用单元测试框架,如JUnit,可以帮助自动化...

    hibernate + shardingjdbc +springboot 结合做的demo

    在这个示例中,我们将探讨如何将Hibernate ORM框架、ShardingSphere的ShardingJDBC模块与Spring Boot整合,构建一个高效的分布式数据库应用。这样的组合允许我们利用Hibernate的强大ORM能力,同时通过ShardingJDBC...

    hibernate+junit+mysql-jdbc开发核心jar包三合一

    本资源“hibernate+junit+mysql-jdbc开发核心jar包三合一”显然是为了支持SSH框架中的Hibernate部分,并结合JUnit进行测试以及MySQL数据库连接。现在我们将详细探讨这三个组件及其在Java开发中的应用。 **Hibernate...

    hibernate测试

    通过使用Hibernate,开发者可以避免编写大量的JDBC代码,而是专注于业务逻辑,从而提高开发效率。 2. **实体与映射** 在Hibernate中,实体是数据库表的Java类表示,它们通过一个名为`hibernate-mapping`的XML文件...

    springmvc_hibernate_ibatis_jdbc

    标题中的"springmvc_hibernate_ibatis_jdbc"指的是一个整合了SpringMVC、Hibernate、iBatis和JDBC这四种关键技术的Java应用框架。这个框架旨在提供一个全面且强大的解决方案,便于开发人员进行Web应用程序的构建。 ...

    Hibernate 框架测试版本

    Hibernate 是Java社区中最流行的ORM框架之一,它通过将Java对象与数据库表进行映射,消除了传统的JDBC代码,提高了开发效率和代码的可维护性。Hibernate 支持多种数据库,如MySQL、Oracle、PostgreSQL等,并提供了...

    spring-Hibernate整合代码测试过程

    总结起来,"spring-Hibernate整合代码测试过程"涉及了Spring框架的依赖注入、事务管理、以及与Hibernate的整合,同时也涵盖了Hibernate的实体映射、DAO设计和事务控制。通过这个过程,我们可以构建出一个高效、健壮...

    Hibernate 参数设置一览表.doc

    接着是一些与JDBC和连接相关的属性: 1. **hibernate.jdbc.fetch_size**:设置JDBC的抓取大小,以优化结果集的处理。 2. **hibernate.jdbc.batch_size**:用于批量更新操作,提高性能。通常建议值在5到30之间。 3...

    hibernate与spring整合demo

    将Hibernate与Spring整合可以充分利用两者的优点,提高开发效率并降低复杂性。 一、Hibernate概述 Hibernate是Java世界中领先的ORM框架之一,它允许开发者用Java对象来操作数据库记录,而无需编写SQL语句。通过配置...

    Hibernate Hibernate5 讲义 PDF

    例如,Hibernate实体管理器库、日志库、JUnit测试库和数据库驱动程序等都是进行Hibernate开发时需要配置的。 在Hibernate 5中,持久化对象(PO)的定义、映射文件的配置以及主配置文件的设置是实现数据持久化的关键...

    hibernate和MySQL的jar

    在描述中提到的“核心jar,亲测可用,跑demo是够用了”,这表明这些jar文件包含了运行Hibernate与MySQL交互所需的基本组件,并且已经有人验证过它们在演示或测试环境中可以正常工作。通常,这包括Hibernate的核心库...

    Hibernate入门jar包

    - MySQL驱动:例如`mysql-connector-java.jar`,它是与MySQL数据库通信的桥梁,使得Hibernate能够通过JDBC(Java Database Connectivity)接口连接到MySQL数据库。不同的数据库可能需要不同版本的驱动,确保使用与...

    eclipse jdbc

    Eclipse JDBC是一个重要的Java开发工具,它为数据库连接和数据操作提供了强大的支持。...在Eclipse环境中,通过这些驱动,开发者可以利用JDBC的强大功能,实现与数据库的无缝连接,从而提高开发效率和应用的稳定性。

    Hibernate的查询 测试的架子

    这些工具可以帮助我们在编写和测试查询时提高效率,同时也能帮助我们快速定位和解决问题。 总的来说,`Hibernate的查询测试架子`是开发和维护高质量Java应用的关键组成部分。通过理解和熟练运用各种查询方式,结合...

    hibernate、struts、mysql_jdbc、junit

    - 使用Hibernate进行数据持久化,使得数据库操作与业务逻辑分离,降低了耦合度。 - 通过Struts2处理HTTP请求,提供友好的用户界面和灵活的控制流程。 - 利用MySQL_JDBC进行数据库交互,保证数据的安全存储和高效查询...

    hibernate课件

    Hibernate是Java开发中用于简化数据库操作的一个开放源代码框架,它允许开发者将数据库操作与业务逻辑解耦,从而提高开发效率和代码质量。 1. Hibernate概述: Hibernate是一种基于Java的持久化框架,它通过映射...

    dm8-jdbc 达梦8连接jdbc、Hibernate的 对应jdk1.6、1.7、1.8jar包

    标题"dm8-jdbc 达梦8连接jdbc、Hibernate的 对应jdk1.6、1.7、1.8jar包"表明这是一个关于达梦数据库(DM8)与Java应用程序交互的资源集合。其中,'dm8-jdbc'是DM8的Java数据库连接(JDBC)驱动程序,它允许Java应用...

    DB2 JDBC 应用实例

    DB2 JDBC 应用实例是基于Java Database Connectivity (JDBC) API与IBM的DB2数据库进行交互的一个实际项目。这个实例提供了丰富的学习材料,帮助开发者理解如何利用JDBC技术来设计、实现和优化与DB2数据库连接的应用...

Global site tag (gtag.js) - Google Analytics