日期:2014-05-16  浏览次数:20614 次

hibernate和jdbc加载对象性能

?

skzr.org 写道

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依然不行

?

?

?

?

1 楼 skzr.org 2011-05-04  
顺便测试了数据库加载和文件加载的性能差别:
同最前面的:100W数据。
持久化到文件中,然后再反序列化到内存,耗时9.58s>>数据库写入耗时五百多秒
2 楼 terencewong 2012-02-15  
你这个benchmark是不是会误导别人?你的DB table有index吗?如果有的话,插入当然费时了。
3 楼 skzr.org 2012-02-16  
terencewong 写道
你这个benchmark是不是会误导别人?你的DB table有index吗?如果有的话,插入当然费时了。


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

关键是后来在实际中的一次测试——