关于PreparedStatement性能一个小问题
有下面两种情况:1:
PreparedStatement pst=conn.prepareStatement(sql);
for(Object o:vt){
pst.setObject(1,o);
...
pst.executeUpdate();
...
}
2.
for(Object o:vt){
PreparedStatement pst=conn.prepareStatement(sql);
pst.setObject(1,o);
...
pst.executeUpdate();
...
pst.close;
}
相对于数据库而言,那种性能更好?为什么 --------------------编程问答-------------------- 用addBatch
然后executeBatch可能更好 --------------------编程问答--------------------
用批处理 --------------------编程问答-------------------- 一般是1000条 提交一次 --------------------编程问答-------------------- 不是讨论批处理的问题,那我改成
pst.executeUpdate();吧
我想问下,第二种方法,数据库会解析几次:一次还是N次 --------------------编程问答-------------------- 第二种要快点,不需要重复的创建PreparedStatement 对象,当然楼主问这个问题,很搞,你自己弄个几万条数据main函数跑一下试试不就知道了嘛。当然最快的还是用batch,1000条一提交 --------------------编程问答-------------------- 这种问题。。。 自己测一下不就知道了。宁可相信别人说的,也不相信自己测的? --------------------编程问答--------------------
有些问题即使知道结果 分析代码还是很有必要的
数据库方面我不觉得会有什么差别 但是在JVM中,第二种方易做图定义pst很多次 所以效果应该会差一点 --------------------编程问答-------------------- 两种写法只要sql文本是一样的(即使多个空格也不行),数据库的执行环境一样,在数据库里表现形式是一样的,都会使用同一个共享游标
(还有要注意的是oracle引擎有绑定变量的分级,他根据绑定变量长短可以将绑定变量分为四个级别,所以一条相同的sql因为绑定标量分级的不同也会进行硬解析,而不会使用共享游标,这个其实也算是执行环境不同)
另外,就java而言第一种写法是标准规范的 --------------------编程问答--------------------
connection.setAutoCommit(false);--------------------编程问答-------------------- 1好些,直觉 --------------------编程问答-------------------- upupupup --------------------编程问答-------------------- 第一种要好一些,第二种不停地申请空间,用完之后又得利用java的自动回收来释放空间,必然会影响性能的。第一种只申请一次,然后重写sql语句,节省了申请和释放空间的时间,自然要好一些了。个人之见。。
PreparedStatement ps = connection.prepareStatement(sql);
for(Object o:vt){
ps.setObject(1,o);
ps.addBatch();
}
int[] updateCounts = ps.executeBatch();
conneciton.commit();
connection.setAutoCommit(true);
补充:Java , Java EE