Java的一个for循环中执行两句sql时的性能问题 应该涉及到1、Oracle的TX锁(行级锁、事务锁)2、TM锁(表级锁)这些吧,等大牛 来解疑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 分开的话,估计是你做update的时候把所需的块全部灌进内存(buffer cache),然后做insert的时候几乎都是内存计算了 得看你具体update什么,insert什么了以及用到的where条件和索引情况,insert一般不费时,主要是update费时,update+insert,数据会越来越多,而update后再insert,数据相对少一点,可以试试把insert放第一个循环看看会是什么效果 恩,是的的确是update消耗的时间更多。再把问题描述具体一些:transaction beginfor(Object obj:List){ 执行一次DB的update操作; 执行一次DB的insert操作;}transaction commit.这样处理的话,计算过执行500次的update和insert时间需要11秒左右。其中update大概耗时10.5秒,insert值需要0.5秒。但是,如果修改成以下方式:transaction beginfor(Object obj:List){ 执行一次DB的update操作;}for(Object obj:List){ 执行一次DB的insert操作;}transaction commit同样的执行500次的话(List中有500条记录),只需要3秒。其中update大概耗时2.5秒,insert值需要0.5秒。更新做的作业如下:依据record的几个关键字段把表中的的flag更新为1,*******************************************UPDATE /*+ hint */ table_nameSET order_flag = '1'WHERE productName = :productNameAND serialNo = :serialNoAND demandName = :demandNameAND order_flag is null*******************************************insert就是简单的登录类似记录。 不应该先从数据库的角度考虑,应该先从增强型for语句和普通型for语句的性能考虑,增强型for语句在处理大数据量的时候消耗的时间比普通型要慢很多,数据量越大,处理时间越长。你可以执行我写的以下语句进行查看的。ArrayList<String> testList = new ArrayList<String>(); for(int i = 0; i < 10000000; i++){ testList.add(i + ""); } long begin; long end; System.out.println("增强型for耗时:"); begin = System.currentTimeMillis(); for(String x : testList){ } end = System.currentTimeMillis(); System.out.println(end - begin); System.out.println("普通型for耗时:"); begin = System.currentTimeMillis(); for(int x = 0; x < testList.size(); x++){ } end = System.currentTimeMillis(); System.out.println(end - begin); System.out.println("迭代器耗时:"); begin = System.currentTimeMillis(); for(Iterator<String> iter = testList.iterator(); iter.hasNext(); iter.next()){ } end = System.currentTimeMillis(); System.out.println(end - begin); 你对增强型for循环理解错了吧,它在做遍历的同时还创建了临时变量,并且执行了get()方法;而你的普通for循环什么都没干,纯粹只执行了 x < list.size(),没有创建临时变量也没有执行get操作,这样何来可比性? 写了个SQL语句,用到序列,希望大神指点一下 oracle出错 30分在线求一延时触发器 plsql developer调用别的包时调试问题 遇到了一条SQL语句,看不懂,请教下.. 怎么查看用户名和密码? TNS没有监听? SQL如何写:如何选取时间最前面且有行数限制; exp时出现“导出视图与数据库版本不兼容”问题??? 9I的SQL语句参数太多,在9I的哪个程序中有SQL语句的帮助呀?谢谢 高手请进,生产库上一张表老不走索引,人工做下表分析又走索引了,可一段时间后又不走索引呢,反反复复好多次 MDF文件如何导入到oracle数据库?
transaction begin
for(Object obj:List){
执行一次DB的update操作;
执行一次DB的insert操作;
}
transaction commit.
这样处理的话,计算过执行500次的update和insert时间需要11秒左右。
其中update大概耗时10.5秒,insert值需要0.5秒。但是,如果修改成以下方式:
transaction begin
for(Object obj:List){
执行一次DB的update操作;
}
for(Object obj:List){
执行一次DB的insert操作;
}
transaction commit同样的执行500次的话(List中有500条记录),只需要3秒。
其中update大概耗时2.5秒,insert值需要0.5秒。更新做的作业如下:依据record的几个关键字段把表中的的flag更新为1,
*******************************************
UPDATE /*+ hint */ table_name
SET order_flag = '1'
WHERE productName = :productName
AND serialNo = :serialNo
AND demandName = :demandName
AND order_flag is null
*******************************************insert就是简单的登录类似记录。
for(int i = 0; i < 10000000; i++){
testList.add(i + "");
}
long begin;
long end;
System.out.println("增强型for耗时:");
begin = System.currentTimeMillis();
for(String x : testList){
}
end = System.currentTimeMillis();
System.out.println(end - begin);
System.out.println("普通型for耗时:");
begin = System.currentTimeMillis();
for(int x = 0; x < testList.size(); x++){
}
end = System.currentTimeMillis();
System.out.println(end - begin);
System.out.println("迭代器耗时:");
begin = System.currentTimeMillis();
for(Iterator<String> iter = testList.iterator(); iter.hasNext(); iter.next()){
}
end = System.currentTimeMillis();
System.out.println(end - begin);
你对增强型for循环理解错了吧,它在做遍历的同时还创建了临时变量,并且执行了get()方法;而你的普通for循环什么都没干,纯粹只执行了 x < list.size(),没有创建临时变量也没有执行get操作,这样何来可比性?