- 论坛徽章:
- 0
|
- for (int i=1;i<=st;i++){
- ......
- str = "insert into test (id,txt) values(?,?);";
- PreparedStatement pstmt = con.prepareStatement(str);
- ......
- }
复制代码
按道理这样用语句句柄和
con.ExecuteStatement(str);
所做的工作对数据库来说没有区别, 都是准备一个句柄, 插入数据后丢弃该句柄, 然后下一个循环再准备一个..., 但你至少可以少写点代码吧? 我不知道java是如何处理这样的语句的(有智能缓存?), 但按我所知道编程语言的规则, 其工作和我描述的应该是一致的, 但第二种方法就不一样, 语句句炳只准备一次, 然后重复用了st次。
打个比喻,1000千个人去食堂吃饭,你的方法是每个人一个菜单,厨房为每个人独立做一次,要做完1000份饭要多长时间你算吧,而第二种用法的意思是让厨房做足够的菜,开饭的时候每人打一份,这样的效率当然就高了。
你虽然也使用了
str = "insert into test (id,txt) values(?,?);";
PreparedStatement pstmt = con.prepareStatement(str);
来做准备,但很不幸的是:用错地方了!在循环里面用,就是每个循环要准备一次,3000个循环下来就是3000次,在一个数据库操作中,准备是很费时间的,至少要比真正往数据库中插入一条记录使用的时间要多。
这也不算优化的事情,一个常识来的。
如果打开PG的储存冲刷,又使用默认的事务(就是每执行一条语句一个事务),则Insert和Update是很慢的,因为从数据安全性考虑,一个事务完成并真实保存到磁盘后数据才算是比较安全的。速度优化的方法有很多,例如使用合适大小的事务,忽略储存冲刷等。 |
|