- 浏览: 365469 次
- 性别:
- 来自: 长沙
文章分类
- 全部博客 (186)
- J2EE (46)
- spring (4)
- Applet (7)
- 网页前端 (10)
- 生活与工作 (55)
- 开放的世界 (10)
- linux (16)
- j2me (2)
- android (5)
- ExtJS (1)
- 架构师与设计 (7)
- 开发平台 (2)
- Eclipse (4)
- 教育 (0)
- 数据库 (9)
- English (1)
- Jetty (2)
- 未分类 (1)
- 工具 (2)
- flex (2)
- synchronized (1)
- maven (2)
- command (0)
- shell (1)
- web (1)
- qq (3)
- wine (3)
- chrome (1)
- extensions (1)
- plugin (1)
- 插件 (1)
- ssh (1)
- 内网 (1)
- J2EE excel (1)
- ubuntu (4)
- storm (2)
- hadoop (1)
最新评论
-
skzr.org:
jdbc:mysql://localhost:3306/?us ...
storm topology all in one spring文件合并 -
chenghong726:
你好,我用你这个方法,上传文件72M一直卡在 mapper.s ...
超大excel读取 43万记录 26M文件 -
海hai:
您好我对这篇文章很敢兴趣可以和你请教下吗?我qq9034418 ...
淘宝top自动授权页面,方便大家调试top应用 -
skzr.org:
首先感谢你的关注:)yaerfeng1989 写道最代码上有更 ...
[MAVEN]web工程的调试 -
skzr.org:
最新消息2013-12-17:腾讯再次弹出消息,我的QQ201 ...
ubuntu 12.04安装QQ2012
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
- jdbc从数据库拿出来变成对象,大约内存占用:1300MB。
- jdbc执行时间:09:47:28,989->09:54:51,456
- time: 7:23s mem: 1819.28-756.68=1062.6MB
- 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确实会产生性能的影响(详见此博文我的一条评论oracle数据从一个表空间导入到另外一个表空间)
所以我那个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确实会产生性能的影响(详见此博文我的一条评论oracle数据从一个表空间导入到另外一个表空间)
所以我那个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>>数据库写入耗时五百多秒
同最前面的:100W数据。
持久化到文件中,然后再反序列化到内存,耗时9.58s>>数据库写入耗时五百多秒
发表评论
-
答复: 再谈一个关于final的不一致编译的低级错误
2012-09-25 09:13 1077tlde_ti 写道 我是觉得连依赖管理工具都不用的项目实在 ... -
[MAVEN]web工程的调试
2011-12-18 21:48 4106接上篇:[MAVEN]maven最佳实践 mav ... -
[jetty]jetty学习
2011-12-27 16:19 2535Jetty源码学习 图源码:jetty.dia ... -
[jetty]start.jar启动
2011-12-27 16:16 2747概图 关键点 org.eclipse.jetty ... -
在java中怎样执行系统命令?
2011-12-05 00:12 0linux比较容易实现,windows下问题千奇百怪。 ... -
[MAVEN]maven最佳实践
2011-12-06 11:00 2234参考资料: 官方:http://maven.ap ... -
java点滴
2011-11-25 00:18 0main静态方法调用: 意思的在method ... -
[java]synchronized我的理解
2011-11-18 21:56 1815多线程、同步、锁,搞 ... -
tomcat攻略
2011-07-23 10:51 6885以下是常见的tomcat配置和问题 以下总结来自实践(OS: ... -
[web工程]Struts2+Spring3.1+Hibernate3.6的集成
2011-05-20 00:32 2020背景:如果选择struts2+Spring+Hibernate ... -
[web工程]集成struts2 mvc
2011-05-20 00:30 2165返回:[web工程]Struts2+Spring3 ... -
[web工程]集成hibernate
2011-05-20 00:28 1472返回:[web工程]Struts2+Spring3.1+ ... -
[web工程]创建web工程
2011-05-19 21:30 1963返回:[web工程]Struts2+Spring3.1+Hib ... -
[分享][Hibernate]公用DAO
2011-05-15 23:27 1968通过Hibernate的元信息处理组件等等,利用spring封 ... -
[经验][hibernate][自定义类型]hibernate 3.6.3中自定义类型,json类型
2011-05-14 12:05 1451首先感谢您百忙之中的阅读 :) 下面进入正题 在3. ... -
java远程调用通讯协议比较
2011-04-12 16:11 1525我的测试: 环境: 使用spring做为粘合剂 ... -
svn经验
2011-03-30 12:55 1429一下内容摘录自自己的wiki,所以链接可能有问题! 目录 ... -
完善包注释[javadoc package-info.java]
2011-03-27 14:03 6474包级注释 说明: 包级注释,有时候是非常有用的,可以清晰的 ... -
Tomcat7新特性?cookie HttpOnly的那些事(sessionid获取麻烦了)
2011-03-26 10:46 13206环境: tomcat6和tomcat7, ... -
weblogic部署应用
2011-02-16 19:59 1174weblogic部署应用 weblogic 1 怎样 ...
相关推荐
本话题将详细探讨两种常见的Java技术:Hibernate和JDBC,用于实现这一目标。 **JDBC(Java Database Connectivity)** 是Java平台上的标准API,它允许Java应用程序连接到各种类型的数据库。JDBC提供了连接数据库、...
### Hibernate与JDBC:概述与对比 #### 一、JDBC简介 ...总结而言,Hibernate和JDBC都是Java应用与数据库交互的重要工具,各有优劣。选择使用哪个取决于具体项目的需求、团队的技术背景以及预期的性能目标等因素。
标题 "Jdbc 和hibernate" 提到的两个主要概念是Java数据库连接(JDBC)和Hibernate,它们都是Java开发中用于与关系型数据库交互的重要技术。本文将深入探讨这两个技术,以及它们之间的区别和联系。 JDBC是Java平台...
2. **非线程安全**:JDBC和Hibernate中的数据库连接或会话对象都不是线程安全的,因此在多线程环境中使用时需要注意同步控制。 3. **事务管理**:两者都支持显式的事务处理,可以通过编程方式来控制事务的提交和回滚...
此外,还可以通过分析Hibernate的性能指标来调整诸如`hibernate.jdbc.batch_size`等参数,以达到最佳性能平衡。 总之,通过上述几个方面的优化措施,可以显著提高基于Hibernate构建的应用程序的性能。在实际应用中...
1. **连接池管理**:为了提高性能和资源利用率,封装可能会集成如C3P0、HikariCP或Apache DBCP等连接池库,使得数据库连接能被有效管理和复用。 2. **SQL参数化**:类似Hibernate的预编译SQL(PreparedStatement)...
6. **内存消耗**:由于Hibernate需要维护对象状态和映射关系,因此在内存使用上可能会比JDBC多。在资源有限的环境中,这可能成为选择JDBC的一个因素。 7. **事务管理**:Hibernate支持自动事务管理,简化了编程。而...
8. **懒加载和级联操作**:了解如何配置和使用懒加载以优化性能,以及如何设置级联操作以简化对象间的关联操作。 总的来说,掌握JDBC和Hibernate对于Java开发者来说是至关重要的,它们是连接Java应用程序与数据库的...
但是,相比JDBC,Hibernate可能带来一定的性能开销。 总之,JDBC适合简单、低级别的数据库操作,而Hibernate则适用于复杂的业务逻辑和大型项目,它提供了更高的抽象层次和便利性。开发者可以根据项目的具体需求和...
开发者可以根据性能和需求选择合适的加载策略。 **十、实体关系映射** Hibernate支持多种关系映射,如一对一、一对多、多对一和多对多,通过@OneToOne、@OneToMany、@ManyToOne、@ManyToMany等注解实现对象间的关联...
首先,Hibernate的核心概念是对象关系映射(ORM),它通过在Java对象和数据库记录之间建立映射关系,实现了数据的透明访问。ORM解决了传统的JDBC编程模式中数据访问的繁琐性,提高了开发效率。在Hibernate中,实体类...
**Hibernate**是一个优秀的对象关系映射框架,它解决了JDBC繁琐的数据库操作,将数据库操作与业务逻辑解耦,提高了开发效率。 3. **Hibernate核心组件** - **SessionFactory**: 代表数据库的会话工厂,创建Session...
2. **配置Hibernate**:在Hibernate的配置文件(通常是hibernate.cfg.xml)中,指定JDBC驱动类和数据库连接URL。对于SQL Server,驱动类通常是`com.microsoft.sqlserver.jdbc.SQLServerDriver`,URL格式可能类似于`...
4. **加载和检索(Load and Retrieve)**:使用`get()`或`load()`方法可以按主键从数据库中获取对象。`Query`和`Criteria` API则提供了更灵活的查询机制,可以根据不同的条件查找对象。 5. **批处理(Batch ...
【Hibernate性能优化】:在Java开发中,Hibernate作为流行...在实际开发中,开发者应根据业务场景选择合适的锁定策略,并结合缓存和延迟加载技术,以及优化SQL查询,来平衡性能和数据一致性,实现高效的Hibernate应用。
综上所述,Hibernate和Spring的结合使用能大幅提升Java应用程序的开发效率,但同时也需要开发者对两者有深入的理解,以解决可能出现的性能和设计难题。掌握这些技术要点,有助于在实际项目中更好地运用这两个强大的...
标题中的“hibernate和MySQL的jar”指的是Hibernate ORM框架与MySQL数据库之间的连接库。Hibernate是一种流行的Java对象关系映射(ORM)工具,它允许开发者使用面向对象的编程方式来操作数据库,而无需直接编写SQL...
Hibernate 是一个流行的对象关系映射(ORM)框架,...这些参数的调整需要根据具体的应用场景和数据库特性来进行,合理的配置可以显著提升Hibernate应用的性能和稳定性。在开发过程中,应不断测试和监控以找到最佳配置。