`
kylinsoong
  • 浏览: 240710 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Hibernate,JDBC性能探讨

 
阅读更多

      今天原打算研究一下Hibernate 1+N问题,却发现了一个Really Amazing的效率问题,问题如下,希望大牛可以解释一下:

1、简单描述一下测试中表结构(我用Mysql数据库),表结构如下图



 表名为Corporation,三个字段id、name、type,对应Mysql中表结构截图:



 

2、如下代码,简单调运JDBC测试插入10000条数据花费时间

public class DB {
	public static Connection getConn() {
		Connection conn = null;
		try {
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/hibernate?user=root&password=root");	
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return conn;
	}
	public static Statement getStmt(Connection conn) {
		Statement stmt = null;
		try {
			if(conn != null) {
				stmt = conn.createStatement();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return stmt;
	}
	public static void main(String[] args) throws SQLException {
		Statement stmt = getStmt(getConn());
		Date start = new Date();
		for(int i = 0 ; i < 10000 ; i ++) {
			String sql = "insert into corporation(name,type) value('Tibco','IT')";
			stmt.executeUpdate(sql);
		}
		System.out.println("Total spent " + (new Date().getTime() - start.getTime()));
	}
}

 

运行时间如下

Total spent 249531

 这个时间我觉得是比较合理的执行一条SQL花费25毫秒左右,之前有关效率方面的测试和这个结果差不多

 

3. 下面给出Hibernate中测试时间的代码,先给出Hibernate配置代码

3.1 Corporation对应的Annotation配置类

@Entity
public class Corporation {
	private int id;
	private String name;
	private String type;
	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getType() {
		return type;
	}
	public void setType(String type) {
		this.type = type;
	}
}

 3.2 hibernate.cfg.xml配置信息

<hibernate-configuration>
    <session-factory>
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost/hibernate</property>
        <property name="connection.username">root</property>
        <property name="connection.password">root</property>
		<property name="connection.pool_size">1</property>
		<property name="current_session_context_class">thread</property>
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
        <property name="show_sql">true</property>
        <property name="format_sql">true</property>
        <property name="hbm2ddl.auto">update</property>
        <mapping class="com.kylin.test.Corporation"/>
    </session-factory>
</hibernate-configuration>

 3.3给出测试代码

package com.kylin.test;

import java.util.Date;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

public class AllTest {
	private static SessionFactory sessionFactory;
	@BeforeClass
	public static void beforeClass(){
		sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
	} 
	@AfterClass
	public static void afterClass() {
		sessionFactory.close();
	}
	@Test
	public void testExportTable() {
		new SchemaExport(new AnnotationConfiguration().configure()).create(true, true);
	}
	@Test
	public void saveCorporation() {
		Date start = new Date();
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		for(int i = 0 ; i < 10000 ; i ++) {
			Corporation c = new Corporation();
			c.setName("Tibco");
			c.setType("IT");
			session.save(c);
		}
		session.getTransaction().commit();
		System.out.println("Total spent " + (new Date().getTime() - start.getTime()));
	}
}

 

如上saveCorporation()方法就是Hibernate想数据库中插入10000条数据的部分,这个结果确实令我吃惊,如下

Total spent 8781

我测试了多次这个时间都是8700毫秒左右,所以这个时间应该准确。 

249531 / 8781 = 28.41,28倍,的确是28倍

4、分析一下

      之前比较过Cassandra(分布式数据库)与Mysql的存储效率差别时发现关系数据库存储的SQL操作效率相当低,而Hibernate解决的是可以面向对象的操作关系数据库,所以我个人一直以为,Hibernate操作数据库的效率一定更低,但结果却恰恰相反,而且与我的之前的理解相差很大,所以我可以肯定的是Hibernate在数据操作效率上也有一定的技巧,大家谁知道可以说说。

 

PS。。本来还想再分析分析,但是周末了,不想再多呆在公司……

  • 大小: 2.1 KB
  • 大小: 5.2 KB
分享到:
评论
19 楼 shaozhuang.liu 2010-08-21  
通过楼主的测试代码可以看出来:
1. lz只是"了解" jdbc,连熟悉都算不上
2. lz只是"了解" hibernate, 连熟悉都算不上, 甚至连基本的hibernate文档都没有读过, 是"读过", 那眼睛扫过不算.
这样的人竟然还来比较二者的性能??
18 楼 jitabc 2010-08-21  
又一个蛋痛帖,先搞清楚hibernate底层不还是调用jdbc,在运用合理情况下性能区别能有多大?
17 楼 gwpking8419 2010-08-21  
hibernate自己能插入数据库?还不得转化成数据库的sql。就转化这个过程就比jdbc多了个步骤,效率怎么会比jdbc快呢?还是看看你的jdbc操作,然后看看hibernate中转化成jdbc的操作吧
16 楼 zhuyan_zy 2010-08-21  
此贴体现了框架存在的意义之一
15 楼 笑我痴狂 2010-08-21  
首先得说jdbc肯定比hibernate快
这里楼主的程序写的不好,如果把jdbc改成batch提交  我想时间应该就很短了

现在来具体分析下:

jdbc测试:
没insert一条记录  就跟数据库打交道一次 ,这里一共连接了1000次数据库 光是连接数据库的时间就已经很长了

hibernate测试:
for(int i=0;i<1000;i++){
    。。。。
    session.save() ;
}


在这个过程中session保存对象时 ,是放在了session中 ,此时还没有真正的持久化到数据库,
在最后执行commit的时候,才真正的持久化到数据库 ,所以这1000个对象在同一时候被持久化到数据库中
在效率上来说 可想而知了


简单的说就是一桶水 ,执行jdbc的时候,每一次取一小瓢放到缸里

hibernate执行时,直接把一桶水倒到缸里 ,这样的测试当然是hibernate快了

小弟不才  哈哈哈哈哈哈哈哈哈

14 楼 sam_chi 2010-08-21  
Hibernate在底层也是利用了JDBC来操作数据库的,只不过它操作的方式可能与我们通常使用的JDBC方式不太一样,研究一下
13 楼 ztcwh 2010-08-21  
批量操作的效率是挺高的。
12 楼 fireflyc 2010-08-21  
。。。。事务。。。。。。。
你要是每提交一次一个事务我敢保证不快,毫无疑问。
11 楼 chrislee1982 2010-08-21  
JDBC绝对比hibernate快,毋庸置疑!
10 楼 skzr.org 2010-08-21  
mikewang 写道
出了batch 以外

jdbc 插入的代码写也有问题。

你那个写法, 每个insert 都要启动和提交一个事务

调用 conn.startTranscation()
然后在执行 insert
最后 conn.commit()

改成这样, jdbc 估计就比hibernate 快10倍了


和我的理解一样的
默认是自动commit,所以每一条语句都是一个事务
jdbc有10000个事务
而hibernate只有一个
所以jdbc比hibernate慢就正常了

老实说,这个争论hibernate还是jdbc快没有什么意义

经验证明,往往在应用中过早考虑此问题,实际上这个根本不是未来的性能缺陷所在,反而使用hibernate带来开发上节省的时间比解决性能问题的时间效益高
9 楼 rrsy23 2010-08-21  
hibernate 底层就是Jdbc 她不可能超越JDBC

只是hibernate漠然有优化  如果你的HDBC很垃圾 那自然hibernate快

如果都是最优那JDBC原始肯定快

但是要求程序员高
8 楼 rrsy23 2010-08-21  
JDBC 1秒 1万条简单sql是没有问题

你batch 10000
7 楼 ArdenL 2010-08-21  
要看你组织的SQL了, Hibernate无论如何 也没有SQL快,呵呵呵,  至少它要浪费一步时间去生成SQL,然后再交给DB,呵呵呵呵
6 楼 skydream 2010-08-21  
呵呵,一叶障目不见泰山!
5 楼 glamey 2010-08-21  
hibernate跑起来不可能比Mysql快的。应该是楼主的jdbc插入有问题。或者是hibernate默认的是批量插入。应该看下他的代码就知道了。
4 楼 nkadun 2010-08-21  
hibernate不可能比jdbc快的。
如楼上几位所言:

1、batch
2、事务
3、PreparedStatement
4、String sql往外放(这个影响较小)
3 楼 mikewang 2010-08-20  
出了batch 以外

jdbc 插入的代码写也有问题。

你那个写法, 每个insert 都要启动和提交一个事务

调用 conn.startTranscation()
然后在执行 insert
最后 conn.commit()

改成这样, jdbc 估计就比hibernate 快10倍了
2 楼 kimmking 2010-08-20  
batch啊batch
jdbc改成batch试试
1 楼 eliot1949 2010-08-20  
估计hibernate是批量插入吧。看一下他执行的sql就明白了

相关推荐

    本人理解hibernate 与 JDBC 的最本质区别

    标题中的“本人理解hibernate 与 JDBC 的最本质区别”揭示了我们即将探讨的核心主题:Hibernate 和 JDBC 在处理数据库操作时的不同之处。 Hibernate 是一个对象关系映射(ORM)框架,而 JDBC(Java Database ...

    Spring对Hibernate及JDBC提供的支持

    本文将深入探讨Spring如何为Hibernate和JDBC提供支持,帮助开发者更高效地进行数据访问操作。 首先,Spring对Hibernate的支持体现在其集成层面。通过Spring,我们可以将Hibernate的SessionFactory和Session对象的...

    JDBC与Hibernate的比较

    本文将详细探讨两种常见的Java数据库访问方式:JDBC(Java Database Connectivity)与Hibernate,并从多个维度进行对比分析。 #### 一、简介 **JDBC**(Java Database Connectivity)是一种用于执行SQL语句的Java ...

    Jdbc 和hibernate

    标题 "Jdbc 和hibernate" 提到的两个主要概念是Java数据库连接(JDBC)和Hibernate,它们都是Java开发中用于与关系型数据库交互的重要技术。本文将深入探讨这两个技术,以及它们之间的区别和联系。 JDBC是Java平台...

    分别使用Hibernate和JDBC操作数据库

    本话题将详细探讨两种常见的Java技术:Hibernate和JDBC,用于实现这一目标。 **JDBC(Java Database Connectivity)** 是Java平台上的标准API,它允许Java应用程序连接到各种类型的数据库。JDBC提供了连接数据库、...

    hibernate和jdbc测试

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

    hibernate+jdbc版课设 新闻发布系统

    在这个项目中,我们主要探讨的是如何利用Hibernate框架结合JDBC技术来构建一个新闻发布系统。Hibernate是一个强大的对象关系映射(ORM)框架,它允许开发者用面向对象的方式来操作数据库,极大地简化了数据库操作。...

    hibernate + shardingjdbc +springboot 结合做的demo

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

    oracle分别使用jdbc和hibernate的例子

    本文将深入探讨如何使用JDBC和Hibernate来操作Oracle数据库,同时结合提供的标签"源码"和"工具",我们将讨论它们的实现细节和优势。 首先,JDBC是Java语言的标准API,它允许Java应用程序与各种类型的数据库进行通信...

    hibernate-batch-size-test:Hibernate hibernate.jdbc.batch_size 测试

    当设置`hibernate.jdbc.batch_size`时,Hibernate会将多个保存操作组合成一个批次,然后一次性提交到数据库,减少了数据库交互的次数,从而提升了整体性能。在MySQL这样的关系型数据库中,JDBC驱动程序支持批处理,...

    在JDBC,hibernate中实现分页

    本文将深入探讨如何在Java开发环境中使用Hibernate框架以及JDBC结合SQL Server 2005来实现数据分页功能。 #### Hibernate中的分页实现 在Hibernate框架中实现分页功能相对较为简单。通过`Query`对象提供的方法即可...

    JPA JDBC hibernate mybatis对比

    综合来看,JDBC适用于对性能要求极高的场景,而JPA和Hibernate更适合快速开发,它们通过ORM降低了开发难度,但在性能上有所牺牲。MyBatis则提供了一个折中的方案,它保持了开发的灵活性,同时也具备一定的性能优势。...

    Java-Hibernate-JDBC.rar_Author_ Author

    2. **性能**:在执行大量简单的读写操作时,JDBC可能比Hibernate更快,因为JDBC避免了ORM的额外开销。但在复杂查询和大数据量处理中,Hibernate的缓存机制和批处理能力可以提高性能。 3. **灵活性**:JDBC允许直接...

    Hibernate性能优化研究.pdf

    本文旨在通过对Hibernate的深入研究,探讨影响其性能的各种因素,并提出相应的优化策略。 #### 二、O/R Mapping及Hibernate简介 ##### 2.1 O/R Mapping O/R Mapping是一种编程技术,用于在关系数据库和对象之间...

    hibernate-性能优化

    【描述】:在使用 Hibernate 进行数据库操作时,性能问题时常出现,但通过适当的调整和优化,我们可以显著提高 Hibernate 的执行效率,甚至达到接近或超过直接使用 JDBC 的效果。本文将探讨几个关键的优化策略。 ...

    hibernate性能:性能、规模、风险 初评

    本文将探讨Hibernate在不同场景下的性能特点、应用规模及潜在的风险,并尝试分析这些问题背后的原因。 #### 二、Hibernate性能特点 1. **缓存机制**:Hibernate内置了一套完整的缓存体系,包括一级缓存、二级缓存...

    Hibernate缓存机制探讨.doc

    然而,直接使用 JDBC 访问数据库存在一定的性能开销。为了提升性能,Hibernate 引入了缓存机制。缓存是一种位于应用程序和物理数据之间的重要组件,旨在减少对物理数据的直接访问频率,从而提高应用系统的整体性能。...

    Hibernate 参数配置详解

    本文档将深入探讨 Hibernate 的核心配置参数及其功能,帮助开发者更好地理解并利用这些配置项以优化应用性能。 #### 二、Hibernate JDBC 和连接(connection)属性 ##### 1. SQL 方言 (Dialect) - **名称**:`...

    JDBC和hibernate事务的详解

    本讲解将深入探讨JDBC(Java Database Connectivity)和Hibernate两种不同的技术在处理事务时的方法和特点。 ### 1. JDBC事务 JDBC是Java中用于与各种数据库交互的标准接口。在JDBC中,事务管理主要通过以下步骤...

    Hibernate 性能优化

    然而,对于初次接触 Hibernate 的开发者来说,可能会遇到性能方面的问题,尤其是在与传统的 JDBC 方式相比时。这些问题如果不加以解决,很容易影响到项目的整体进度。本文将详细介绍如何优化 Hibernate 的性能,并...

Global site tag (gtag.js) - Google Analytics