`
skzr.org
  • 浏览: 366151 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

hibernate和jdbc加载对象性能

    博客分类:
  • J2EE
阅读更多

 

core2 P8400, 4G mem

 

我的测试100W记录,mysql使用缺省安装,java -server -Xms2048M -Xmx2048M

hibernate

insert 1000000 count, consume 521.133 seconds

jdbc

insert 1000000 count, consume 508.46 seconds

 

select count(*) from APP_USER; 1000000 rows, 0.31 seconds;

 

结构APP_USER(ID, NAME, PASSWORD)

写入数据i: insert into APP_USER(NAME, PASSWORD) values(String.valueOf(i), String.valueOf(i));

 

 

可见Hibernate性能并不太慢。大约损失性能2.75%还是可以接受,如果对性能苛刻的要求建议还是直接jdbc吧。

 

  • hibernate:
    	@Test
    	@Transactional(propagation = Propagation.REQUIRES_NEW)
    	public void testHibernate() {
    		logger.info("start test Hibernate...");  
            long begin = System.currentTimeMillis();
            baseDao.saveOrUpdateAll(users);
            long end = System.currentTimeMillis();  
            logger.info("insert " + num + " count, consume " + (end - begin) / 1000f + " seconds");  
    	}
     
  • jdbc
    	@Test
    	@Transactional(propagation = Propagation.REQUIRES_NEW)
    	public void testJdbc() {
    		logger.info("start test jdbc...");  
            long begin = System.currentTimeMillis();
            jdbcTemplate.batchUpdate("insert into APP_USER(NAME, PASSWORD) values (?, ?)", new BatchPreparedStatementSetter() {
    			@Override
    			public void setValues(PreparedStatement ps, int row) throws SQLException {
    				User user = users.get(row);
    				ps.setString(1, user.getName());
    				ps.setString(2, user.getPassword());
    			}
    			@Override
    			public int getBatchSize() {
    				return users.size();
    			}
    		});
            long end = System.currentTimeMillis();  
            logger.info("insert " + num + " count, consume " + (end - begin) / 1000f + " seconds");  
    	}

不过你的hibenate和jdbc的差距也不是很大阿。

看到你测试性能损失8.37%差不多阿,不过你的这个count太慢了点吧。

 

我一直觉得Hibernate的性能不会很差,我只用他做映射,一般不搞继承、所有关系只用ID而不用对象做对应。

今天测试510W数据从数据库(表实际有3700W记录)加载到内存中:java参数 -server -Xms2048M -Xmx2048M

 

  1. jdbc从数据库拿出来变成对象,大约内存占用:1300MB。
    1. jdbc执行时间:09:47:28,989->09:54:51,456
    2. time: 7:23s  mem: 1819.28-756.68=1062.6MB
  2. hibernate: 无法正确完成,内存不够,调整内存为 -server -Xms2048M -Xmx4000M依然不行

 

 

 

 

分享到:
评论
6 楼 terencewong 2012-02-21  
skzr.org 写道
terencewong 写道

Sorry to type English since I am on duty now. Actually, the primary key will induce DB to create index. Anyhow, lets forget the insertion. Could you provide any detail for your Hibernate proof of concept with big dataset because it is intriguing for me to know which intermediate variables occupy your memory. Maybe you can provide a heap map, and your conclusion will because more sound and solid. Many thanks. 


我英语比较差。
这两点我们是共识的:

所以我那个insert测试的是——jdbc和hibernate他们在insert时性能差距不大
原结论:
skzr.org 写道

可见Hibernate性能并不太慢。大约损失性能2.75%还是可以接受,如果对性能苛刻的要求建议还是直接jdbc吧。


好的,我来试试看看能不能复制你的问题

List<MyBigTable> data = queryHQL("select * from MyBigTable"),对于HQL来说List容量无法指定初始值,必然会发生扩容。
扩容也就算了,同样是jdbc当使用默认new ArrayList<MyBigTable>()作为存储集,也会发生扩容,现象:
1. jdbc方式的却最终能执行完毕
2. hibernate的最终cpu一直100%,长时间(>20分钟)等待无果

终极优化,jdbc:
  • select count(id) from MyBigTable获取size
  • new ArrayList<MyBigTable>(size)作为存储list,再执行jdbc查询


最后:
已经很久很久(>1年)没用hibernate了,一直用spring的jdbc挺好的
1. 开发效率并不比hibernate慢
2. 性能也不再操心了
3. 关键是update时,不再每次把所有的字段set一次了,数据不一致的情况很少了

5 楼 skzr.org 2012-02-20  
terencewong 写道

Sorry to type English since I am on duty now. Actually, the primary key will induce DB to create index. Anyhow, lets forget the insertion. Could you provide any detail for your Hibernate proof of concept with big dataset because it is intriguing for me to know which intermediate variables occupy your memory. Maybe you can provide a heap map, and your conclusion will because more sound and solid. Many thanks. 


我英语比较差。
这两点我们是共识的:

所以我那个insert测试的是——jdbc和hibernate他们在insert时性能差距不大
原结论:
skzr.org 写道

可见Hibernate性能并不太慢。大约损失性能2.75%还是可以接受,如果对性能苛刻的要求建议还是直接jdbc吧。


List<MyBigTable> data = queryHQL("select * from MyBigTable"),对于HQL来说List容量无法指定初始值,必然会发生扩容。
扩容也就算了,同样是jdbc当使用默认new ArrayList<MyBigTable>()作为存储集,也会发生扩容,现象:
1. jdbc方式的却最终能执行完毕
2. hibernate的最终cpu一直100%,长时间(>20分钟)等待无果

终极优化,jdbc:
  • select count(id) from MyBigTable获取size
  • new ArrayList<MyBigTable>(size)作为存储list,再执行jdbc查询


最后:
已经很久很久(>1年)没用hibernate了,一直用spring的jdbc挺好的
1. 开发效率并不比hibernate慢
2. 性能也不再操心了
3. 关键是update时,不再每次把所有的字段set一次了,数据不一致的情况很少了
4 楼 terencewong 2012-02-20  
skzr.org 写道
terencewong 写道
你这个benchmark是不是会误导别人?你的DB table有index吗?如果有的话,插入当然费时了。


兄弟,第一个测试的表结构是APP_USER(ID, NAME, PASSWORD),只是用来测试用,没创建任何其他多余,就是ID是inc的主键。这个测试测试的是insert。

关键是后来在实际中的一次测试——510W数据从数据库(表实际有3700W记录)加载到内存中
hibernate完败,跟踪进去发现hibernate构建数据List出来时,List会产生很多的扩容,最后导致内存(内存已调整到最大4000M依然失败)不够。


Sorry to type English since I am on duty now. Actually, the primary key will induce DB to create index. Anyhow, lets forget the insertion. Could you provide any detail for your Hibernate proof of concept with big dataset because it is intriguing for me to know which intermediate variables occupy your memory. Maybe you can provide a heap map, and your conclusion will because more sound and solid. Many thanks. 
3 楼 skzr.org 2012-02-16  
terencewong 写道
你这个benchmark是不是会误导别人?你的DB table有index吗?如果有的话,插入当然费时了。


兄弟,第一个测试的表结构是APP_USER(ID, NAME, PASSWORD),只是用来测试用,没创建任何其他多余,就是ID是inc的主键。这个测试测试的是insert。

关键是后来在实际中的一次测试——510W数据从数据库(表实际有3700W记录)加载到内存中
hibernate完败,跟踪进去发现hibernate构建数据List出来时,List会产生很多的扩容,最后导致内存(内存已调整到最大4000M依然失败)不够。
2 楼 terencewong 2012-02-15  
你这个benchmark是不是会误导别人?你的DB table有index吗?如果有的话,插入当然费时了。
1 楼 skzr.org 2011-05-04  
顺便测试了数据库加载和文件加载的性能差别:
同最前面的:100W数据。
持久化到文件中,然后再反序列化到内存,耗时9.58s>>数据库写入耗时五百多秒

相关推荐

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

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

    Hibernate and JDBC

    ### Hibernate与JDBC:概述与对比 #### 一、JDBC简介 ...总结而言,Hibernate和JDBC都是Java应用与数据库交互的重要工具,各有优劣。选择使用哪个取决于具体项目的需求、团队的技术背景以及预期的性能目标等因素。

    Jdbc 和hibernate

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

    jdbc和hibernate的区别

    2. **非线程安全**:JDBC和Hibernate中的数据库连接或会话对象都不是线程安全的,因此在多线程环境中使用时需要注意同步控制。 3. **事务管理**:两者都支持显式的事务处理,可以通过编程方式来控制事务的提交和回滚...

    优化Hibernate性能的几点建议

    此外,还可以通过分析Hibernate的性能指标来调整诸如`hibernate.jdbc.batch_size`等参数,以达到最佳性能平衡。 总之,通过上述几个方面的优化措施,可以显著提高基于Hibernate构建的应用程序的性能。在实际应用中...

    类似hibernate的jdbc封装

    1. **连接池管理**:为了提高性能和资源利用率,封装可能会集成如C3P0、HikariCP或Apache DBCP等连接池库,使得数据库连接能被有效管理和复用。 2. **SQL参数化**:类似Hibernate的预编译SQL(PreparedStatement)...

    Java-Hibernate-JDBC.rar_Author_ Author

    6. **内存消耗**:由于Hibernate需要维护对象状态和映射关系,因此在内存使用上可能会比JDBC多。在资源有限的环境中,这可能成为选择JDBC的一个因素。 7. **事务管理**:Hibernate支持自动事务管理,简化了编程。而...

    jdbc和hibernate学习内容

    8. **懒加载和级联操作**:了解如何配置和使用懒加载以优化性能,以及如何设置级联操作以简化对象间的关联操作。 总的来说,掌握JDBC和Hibernate对于Java开发者来说是至关重要的,它们是连接Java应用程序与数据库的...

    oracle分别使用jdbc和hibernate的例子

    但是,相比JDBC,Hibernate可能带来一定的性能开销。 总之,JDBC适合简单、低级别的数据库操作,而Hibernate则适用于复杂的业务逻辑和大型项目,它提供了更高的抽象层次和便利性。开发者可以根据项目的具体需求和...

    Hibernate 操纵持久化对象

    开发者可以根据性能和需求选择合适的加载策略。 **十、实体关系映射** Hibernate支持多种关系映射,如一对一、一对多、多对一和多对多,通过@OneToOne、@OneToMany、@ManyToOne、@ManyToMany等注解实现对象间的关联...

    精通Hibernate:Java对象持久化技术详解.pdf

    首先,Hibernate的核心概念是对象关系映射(ORM),它通过在Java对象和数据库记录之间建立映射关系,实现了数据的透明访问。ORM解决了传统的JDBC编程模式中数据访问的繁琐性,提高了开发效率。在Hibernate中,实体类...

    jdbc和hibernate总结

    **Hibernate**是一个优秀的对象关系映射框架,它解决了JDBC繁琐的数据库操作,将数据库操作与业务逻辑解耦,提高了开发效率。 3. **Hibernate核心组件** - **SessionFactory**: 代表数据库的会话工厂,创建Session...

    Hibernate 加载数据库驱动的 Jar

    2. **配置Hibernate**:在Hibernate的配置文件(通常是hibernate.cfg.xml)中,指定JDBC驱动类和数据库连接URL。对于SQL Server,驱动类通常是`com.microsoft.sqlserver.jdbc.SQLServerDriver`,URL格式可能类似于`...

    hibernate操纵实体对象

    4. **加载和检索(Load and Retrieve)**:使用`get()`或`load()`方法可以按主键从数据库中获取对象。`Query`和`Criteria` API则提供了更灵活的查询机制,可以根据不同的条件查找对象。 5. **批处理(Batch ...

    Hibernate性能(缓存 延迟加载 事务 悲观 乐观锁).ppt

    【Hibernate性能优化】:在Java开发中,Hibernate作为流行...在实际开发中,开发者应根据业务场景选择合适的锁定策略,并结合缓存和延迟加载技术,以及优化SQL查询,来平衡性能和数据一致性,实现高效的Hibernate应用。

    hibernate和spring技术难点及其要点总结

    综上所述,Hibernate和Spring的结合使用能大幅提升Java应用程序的开发效率,但同时也需要开发者对两者有深入的理解,以解决可能出现的性能和设计难题。掌握这些技术要点,有助于在实际项目中更好地运用这两个强大的...

    hibernate和MySQL的jar

    标题中的“hibernate和MySQL的jar”指的是Hibernate ORM框架与MySQL数据库之间的连接库。Hibernate是一种流行的Java对象关系映射(ORM)工具,它允许开发者使用面向对象的编程方式来操作数据库,而无需直接编写SQL...

    Hibernate 参数设置一览表.doc

    Hibernate 是一个流行的对象关系映射(ORM)框架,...这些参数的调整需要根据具体的应用场景和数据库特性来进行,合理的配置可以显著提升Hibernate应用的性能和稳定性。在开发过程中,应不断测试和监控以找到最佳配置。

Global site tag (gtag.js) - Google Analytics