用hibernate 插入posgres数据库1000条数据,87684毫秒

杨华杰 发布于 2013/02/07 09:18
阅读 1K+
收藏 1

用hibernate 插入posgres数据库1000条数据耗时87684毫秒,这个效率是高还是低啊. 如何提高呢?

没有用到数据库连接池和多线程

加载中
0
杨华杰
杨华杰

谢谢大家的热心回答,其实我杞人忧天了。


在web程序开发中,由于java自身的多线程,这种问题完全可以忽略。



其次利用数据库连接池可以大大加快速度。以下是3次测试测试参考数据:

没有数据库连接池插入1000条数据: 87684, 92082,88820

使用c3p0数据库连接池插入1000条数据: 56969, 57567, 55635

1
魔力猫
魔力猫

11毫秒一条。多少因为机器配置、网络环境、数据结构、代码编写等等无法直接说快慢。

我的建议是走批量可以一定程度提高速度,也就是执行几十条插入语句后,flush一下。让数据库几十条几十条的插,不要每次只插一条。还有就是数据库应该有batch的参数,需要调整成合适的大小。

魔力猫
魔力猫
回复 @杨华杰 : 如果你们要求每插入1条都执行一次提交事务,那么我实在无语。哪家数据库也没办法帮你优化得比较快。
杨华杰
杨华杰
插入一条数据11毫秒也不算慢吧
杨华杰
杨华杰
业务需要,不能够批量
1
panmingguang
panmingguang
明显很慢, 用jdbc试试就知道
杨华杰
杨华杰
假如这里不能用呢?
1
panmingguang
panmingguang
jdbc还有不能用的地方, 那hibernate用的什么,不是jdbc, 难不成是ODBC
杨华杰
杨华杰
可以用,但是不想用!保持程序的统一性
0
StormFour
StormFour

不用hibernate好多年

0
YoungIceberg
YoungIceberg

87684你确定是毫秒(1/1,000秒)而不是微秒(1/1,000,000秒)?

要用1分钟半的话平均每条数据有几MB呢?

杨华杰
杨华杰
你想象的数据库操作应该是多块?
杨华杰
杨华杰
确定是毫秒,请看补充的测试代码
0
kenyon_君羊
kenyon_君羊
对这个单位表示怀疑,1000条要87秒啊......
YoungIceberg
YoungIceberg
他这是黑hibernate呢吧!他下面那个例子直接跑SQL的话在虚拟机里也只要1.3秒。Hibernate有这么慢么?
杨华杰
杨华杰
不信你可以自己拿测试代码测一下
0
ajavaloser
ajavaloser

自己给自己设最佳答案,还是个牛头不对马嘴的答案
自己都说了不能用batch,估计业务上就是得一条条顺序插,
在不改机器配置网络配置的环境下,用哪家的数据库都没屁用
@红薯 有人刷分,还是毫无质量的分

ajavaloser
ajavaloser
回复 @杨华杰 : 既然刷分没用,你把自己的回答设成最佳干什么?就你那答案,跟一楼比,差远了 @魔力猫 !说老子是无聊的中国人?原来你不是中国人啊!幸好你不是中国人,不然我真觉得很羞耻!
杨华杰
杨华杰
无聊的中国人,你的答案对我没用。 刷分有什么用吗?你不觉得程序员的时间比分数有用多了吗?
杨华杰
杨华杰
无聊的人
0
杨华杰
杨华杰
@Test
	public void testFindCreate() {
		Long start = System.currentTimeMillis();
		try {
			for(int i=0; i<1000; i++){
				Audit a = new Audit();
				a.setDescription("test Description");
				a.setObject("Test object");
				a.setParam("Test param");
				a.setAction("Test action");
				a.setReturnVal("test return value");
				a.setUserId("test UserId " + i);
				
				auditDAO.save(a);
				assertNotNull(a.getId() );
			}
		} catch (Exception e) {
			System.out.println(e);
		}
		
		Long end = System.currentTimeMillis();
		System.out.println("Cost Time: " + (end - start));
	}
返回顶部
顶部