- 浏览: 240710 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
akka_li:
学习了!但是为什么后续的没有了?!
EJB4:RMI和RMI-IIOP -
springaop_springmvc:
apache lucene开源框架demo使用实例教程源代码下 ...
Lucene学习笔记(一)Lucene入门实例 -
qepipnu:
求solr 客户端 jar包
Solr学习笔记(三)Solr客户端开发实例 -
zhangbc:
是这问题,赞!
Oracle Start Up 2 Oracle 框架构件、启动、解决一个问题 -
feilian09:
查询 select hibernate jdbc 那个效率快
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。。本来还想再分析分析,但是周末了,不想再多呆在公司……
评论
19 楼
shaozhuang.liu
2010-08-21
通过楼主的测试代码可以看出来:
1. lz只是"了解" jdbc,连熟悉都算不上
2. lz只是"了解" hibernate, 连熟悉都算不上, 甚至连基本的hibernate文档都没有读过, 是"读过", 那眼睛扫过不算.
这样的人竟然还来比较二者的性能??
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测试:
在这个过程中session保存对象时 ,是放在了session中 ,此时还没有真正的持久化到数据库,
在最后执行commit的时候,才真正的持久化到数据库 ,所以这1000个对象在同一时候被持久化到数据库中
在效率上来说 可想而知了
简单的说就是一桶水 ,执行jdbc的时候,每一次取一小瓢放到缸里
hibernate执行时,直接把一桶水倒到缸里 ,这样的测试当然是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倍了
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原始肯定快
但是要求程序员高
只是hibernate漠然有优化 如果你的HDBC很垃圾 那自然hibernate快
如果都是最优那JDBC原始肯定快
但是要求程序员高
8 楼
rrsy23
2010-08-21
JDBC 1秒 1万条简单sql是没有问题
你batch 10000
你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往外放(这个影响较小)
如楼上几位所言:
1、batch
2、事务
3、PreparedStatement
4、String sql往外放(这个影响较小)
3 楼
mikewang
2010-08-20
出了batch 以外
jdbc 插入的代码写也有问题。
你那个写法, 每个insert 都要启动和提交一个事务
调用 conn.startTranscation()
然后在执行 insert
最后 conn.commit()
改成这样, jdbc 估计就比hibernate 快10倍了
jdbc 插入的代码写也有问题。
你那个写法, 每个insert 都要启动和提交一个事务
调用 conn.startTranscation()
然后在执行 insert
最后 conn.commit()
改成这样, jdbc 估计就比hibernate 快10倍了
2 楼
kimmking
2010-08-20
batch啊batch
jdbc改成batch试试
jdbc改成batch试试
1 楼
eliot1949
2010-08-20
估计hibernate是批量插入吧。看一下他执行的sql就明白了
发表评论
-
Oracle - Add Exist Validation Before Create Table
2011-11-07 13:49 1464Usually we need to check the ta ... -
JMX Architecture & "Hello Word" the JMX way
2011-10-25 20:07 1819JMX Architecture Overview: JMX ... -
Jboss-eap-5.1 Messaging
2011-08-02 21:50 2481This section I will concertate ... -
Jboss-eap-5.1 starting up note
2011-07-26 22:46 2593Jboss enterprise platform 5 hav ... -
EJB Security & JAAS Demo
2011-05-21 19:39 1616PROLOGUE: When deploying ... -
JBoss LoginInitialContext Factory Implementation
2011-05-15 16:05 1537Jboss has a series of imp ... -
Jboss Reference Exception Gallery
2011-04-27 14:08 28991. Unable to locate a login con ... -
Hibernate Annotation 的一个问题,给点意见
2011-03-10 12:43 22问题:org.hibernate.annotations. ... -
大家说说BBC的网站用的是什么技术做的
2011-02-22 05:01 1443最近在英国出差,发现这里的一些网站做的相当有特色,有些网站不是 ... -
Hibernate OneToMany 单向和双向配置对数据存取性能的比较
2011-02-08 17:06 23341. 开篇说明:今天是春 ... -
对Hibernate属性(CascadeType、JoinColumn、JoinTable、ForeignKey等)的研究
2010-12-26 15:45 16689本文列出几个“EJB 学习阶段总结:JBoss下发布一个Toy ... -
EJB 学习阶段总结:JBoss下发布一个Toy企业应用
2010-12-25 12:11 2649解释题目:为什 ... -
EJB7: Message Driven Bean
2010-12-21 22:42 2153在企业系统中需要使用 ... -
EJB6: EntityBean例子
2010-11-26 14:48 1517本例子描述向EJB容器(JBoss)部署http: ... -
JPA dev: 几个问题总结(续)
2010-11-25 18:02 24902. 如何由PoJo类生成数据库中的表 首先可以根据实体间关 ... -
JPA dev: 几个问题总结
2010-11-25 16:56 3410最近工作中遇到几个与JPA相关的问题,本文通过一个例子总结一下 ... -
JAXB学习
2010-11-24 22:35 01 什么是JAXB? JAXB全称Java Ar ... -
EJB5: JPA扩展-J2SE环境下使用EntityManager
2010-11-10 19:07 2712好久没有写博客了,最近比较忙,今天抽时间写点,最近 ... -
EJB4:RMI和RMI-IIOP
2010-11-02 21:14 4138计划提纲:引入→RMI概念→RMI HelloWorld程序→ ... -
EJB3: JBOSS 企业版、JBOSS服务器构架、EJB2.0 HelloWrold实例
2010-10-26 22:43 6479本文的研究基于jboss-eap- ...
相关推荐
标题中的“本人理解hibernate 与 JDBC 的最本质区别”揭示了我们即将探讨的核心主题:Hibernate 和 JDBC 在处理数据库操作时的不同之处。 Hibernate 是一个对象关系映射(ORM)框架,而 JDBC(Java Database ...
本文将深入探讨Spring如何为Hibernate和JDBC提供支持,帮助开发者更高效地进行数据访问操作。 首先,Spring对Hibernate的支持体现在其集成层面。通过Spring,我们可以将Hibernate的SessionFactory和Session对象的...
本文将详细探讨两种常见的Java数据库访问方式:JDBC(Java Database Connectivity)与Hibernate,并从多个维度进行对比分析。 #### 一、简介 **JDBC**(Java Database Connectivity)是一种用于执行SQL语句的Java ...
标题 "Jdbc 和hibernate" 提到的两个主要概念是Java数据库连接(JDBC)和Hibernate,它们都是Java开发中用于与关系型数据库交互的重要技术。本文将深入探讨这两个技术,以及它们之间的区别和联系。 JDBC是Java平台...
本话题将详细探讨两种常见的Java技术:Hibernate和JDBC,用于实现这一目标。 **JDBC(Java Database Connectivity)** 是Java平台上的标准API,它允许Java应用程序连接到各种类型的数据库。JDBC提供了连接数据库、...
对于性能测试,可以比较使用JDBC和Hibernate执行相同任务的时间消耗,评估哪种方式更高效。同时,要关注内存使用情况,因为ORM框架可能会增加内存开销。 在进行测试时,使用单元测试框架,如JUnit,可以帮助自动化...
在这个项目中,我们主要探讨的是如何利用Hibernate框架结合JDBC技术来构建一个新闻发布系统。Hibernate是一个强大的对象关系映射(ORM)框架,它允许开发者用面向对象的方式来操作数据库,极大地简化了数据库操作。...
在这个示例中,我们将探讨如何将Hibernate ORM框架、ShardingSphere的ShardingJDBC模块与Spring Boot整合,构建一个高效的分布式数据库应用。这样的组合允许我们利用Hibernate的强大ORM能力,同时通过ShardingJDBC...
本文将深入探讨如何使用JDBC和Hibernate来操作Oracle数据库,同时结合提供的标签"源码"和"工具",我们将讨论它们的实现细节和优势。 首先,JDBC是Java语言的标准API,它允许Java应用程序与各种类型的数据库进行通信...
当设置`hibernate.jdbc.batch_size`时,Hibernate会将多个保存操作组合成一个批次,然后一次性提交到数据库,减少了数据库交互的次数,从而提升了整体性能。在MySQL这样的关系型数据库中,JDBC驱动程序支持批处理,...
本文将深入探讨如何在Java开发环境中使用Hibernate框架以及JDBC结合SQL Server 2005来实现数据分页功能。 #### Hibernate中的分页实现 在Hibernate框架中实现分页功能相对较为简单。通过`Query`对象提供的方法即可...
综合来看,JDBC适用于对性能要求极高的场景,而JPA和Hibernate更适合快速开发,它们通过ORM降低了开发难度,但在性能上有所牺牲。MyBatis则提供了一个折中的方案,它保持了开发的灵活性,同时也具备一定的性能优势。...
2. **性能**:在执行大量简单的读写操作时,JDBC可能比Hibernate更快,因为JDBC避免了ORM的额外开销。但在复杂查询和大数据量处理中,Hibernate的缓存机制和批处理能力可以提高性能。 3. **灵活性**:JDBC允许直接...
本文旨在通过对Hibernate的深入研究,探讨影响其性能的各种因素,并提出相应的优化策略。 #### 二、O/R Mapping及Hibernate简介 ##### 2.1 O/R Mapping O/R Mapping是一种编程技术,用于在关系数据库和对象之间...
【描述】:在使用 Hibernate 进行数据库操作时,性能问题时常出现,但通过适当的调整和优化,我们可以显著提高 Hibernate 的执行效率,甚至达到接近或超过直接使用 JDBC 的效果。本文将探讨几个关键的优化策略。 ...
本文将探讨Hibernate在不同场景下的性能特点、应用规模及潜在的风险,并尝试分析这些问题背后的原因。 #### 二、Hibernate性能特点 1. **缓存机制**:Hibernate内置了一套完整的缓存体系,包括一级缓存、二级缓存...
然而,直接使用 JDBC 访问数据库存在一定的性能开销。为了提升性能,Hibernate 引入了缓存机制。缓存是一种位于应用程序和物理数据之间的重要组件,旨在减少对物理数据的直接访问频率,从而提高应用系统的整体性能。...
本文档将深入探讨 Hibernate 的核心配置参数及其功能,帮助开发者更好地理解并利用这些配置项以优化应用性能。 #### 二、Hibernate JDBC 和连接(connection)属性 ##### 1. SQL 方言 (Dialect) - **名称**:`...
本讲解将深入探讨JDBC(Java Database Connectivity)和Hibernate两种不同的技术在处理事务时的方法和特点。 ### 1. JDBC事务 JDBC是Java中用于与各种数据库交互的标准接口。在JDBC中,事务管理主要通过以下步骤...
然而,对于初次接触 Hibernate 的开发者来说,可能会遇到性能方面的问题,尤其是在与传统的 JDBC 方式相比时。这些问题如果不加以解决,很容易影响到项目的整体进度。本文将详细介绍如何优化 Hibernate 的性能,并...