应该涉及到
1、Oracle的TX锁(行级锁、事务锁)
2、TM锁(表级锁)
这些吧,等大牛 来解疑

解决方案 »

  1.   

    分开的话,估计是你做update的时候把所需的块全部灌进内存(buffer cache),然后做insert的时候几乎都是内存计算了
      

  2.   

    得看你具体update什么,insert什么了以及用到的where条件和索引情况,insert一般不费时,主要是update费时,update+insert,数据会越来越多,而update后再insert,数据相对少一点,可以试试把insert放第一个循环看看会是什么效果
      

  3.   

    恩,是的的确是update消耗的时间更多。再把问题描述具体一些:
    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就是简单的登录类似记录。
      

  4.   

    不应该先从数据库的角度考虑,应该先从增强型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);
      

  5.   


    你对增强型for循环理解错了吧,它在做遍历的同时还创建了临时变量,并且执行了get()方法;而你的普通for循环什么都没干,纯粹只执行了 x < list.size(),没有创建临时变量也没有执行get操作,这样何来可比性?