当前位置:编程学习 > JAVA >>

关于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可能更好 --------------------编程问答--------------------
引用 1 楼 ticmy 的回复:
用addBatch

然后executeBatch可能更好


用批处理  --------------------编程问答-------------------- 一般是1000条 提交一次 --------------------编程问答-------------------- 不是讨论批处理的问题,那我改成 
pst.executeUpdate();吧

我想问下,第二种方法,数据库会解析几次:一次还是N次 --------------------编程问答-------------------- 第二种要快点,不需要重复的创建PreparedStatement 对象,当然楼主问这个问题,很搞,你自己弄个几万条数据main函数跑一下试试不就知道了嘛。当然最快的还是用batch,1000条一提交 --------------------编程问答-------------------- 这种问题。。。 自己测一下不就知道了。宁可相信别人说的,也不相信自己测的? --------------------编程问答--------------------
引用 6 楼 rainbowsix 的回复:
这种问题。。。 自己测一下不就知道了。宁可相信别人说的,也不相信自己测的?


有些问题即使知道结果 分析代码还是很有必要的

数据库方面我不觉得会有什么差别 但是在JVM中,第二种方易做图定义pst很多次 所以效果应该会差一点 --------------------编程问答-------------------- 两种写法只要sql文本是一样的(即使多个空格也不行),数据库的执行环境一样,在数据库里表现形式是一样的,都会使用同一个共享游标
(还有要注意的是oracle引擎有绑定变量的分级,他根据绑定变量长短可以将绑定变量分为四个级别,所以一条相同的sql因为绑定标量分级的不同也会进行硬解析,而不会使用共享游标,这个其实也算是执行环境不同)

另外,就java而言第一种写法是标准规范的 --------------------编程问答--------------------
connection.setAutoCommit(false);
PreparedStatement ps = connection.prepareStatement(sql);
for(Object o:vt){
    ps.setObject(1,o);
    ps.addBatch();
}

int[] updateCounts = ps.executeBatch();

conneciton.commit();
connection.setAutoCommit(true);
--------------------编程问答-------------------- 1好些,直觉 --------------------编程问答-------------------- upupupup --------------------编程问答-------------------- 第一种要好一些,第二种不停地申请空间,用完之后又得利用java的自动回收来释放空间,必然会影响性能的。第一种只申请一次,然后重写sql语句,节省了申请和释放空间的时间,自然要好一些了。个人之见。。
补充:Java ,  Java EE
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,