>>>根据list的大小启动n多县城同时插入数据库嘿嘿,厉害你用的什么数据库?只要你的数据库支持,用StringBuffer一次性生成所有的SQL语句,然后执行一次数据库操作

解决方案 »

  1.   

    存储过程?
    涉及到多张表吗?
    是不是用到了blob或者是clob了,怎么会那么大?
      

  2.   

    没有涉及多张表
    drop procedure p_single;
    create or replace procedure p_single(sid in string,starttime in string,endtime in string,
    user in string,sub in string)  as
    begin
    update single set start_time =starttime ,end_time=endtime where userName=user and  subject=sub;
    IF SQL%NOTFOUND THEN
    INSERT INTO single(id,start_time,end_time,userName,subject)
     VALUES(sid,starttime,endtime,user,sub);END IF;commit;
    end;
      

  3.   

    update和insert分开insert只要batch操作就行了,至于update再想办法吧。比如:
    String sqlString = "INSERT INTO single ( "
    + " id, start_time, Tm, end_time, userName"
    + " subject )" 
    + " VALUES ( "
    + "?, ?, ?, ?, ?, "
    + "? ) ";pstmt = conn.prepareStatement(sqlString);
    Iterator it = list.iterator();
    while (it.hasNext()) {
    ...
    pstmt.addBatch();
    }pstmt.executeBatch();同时insert多的表少建索引。select或者update的多的表则需要增加索引,所以一定要想办法把那2个操作分开
      

  4.   

    问题是我要判断数据库油布有这条记录阿?如果有,就update,如果没有才insert,而且,不是根据主键判断的
      

  5.   

    表有主键吗?如果表有主键的话,相同记录insert的时候就会主键重复异常了
      

  6.   

    主键是id,但是更新的时候是不能获得id的
      

  7.   

    那样的记录多吗?
    如果量不是很大的话,自己维护一个记录主键的cache,明确地调用update或者insert
      

  8.   

    纪录最多也就几千条,list里面一次可能1,2百,但是0。n秒后list又会改变
      

  9.   

    我看出来,主要是select for update的操作耗时,应该可以通过在where条件里的字段加索引可以加快速度。
    你说说,是不是IF SQL%NOTFOUND 的条件不成立的情况居多?
      

  10.   

    如果是这样的话,你们的表设计就不是很合理了,把经常改变的属性和基本不变的东西放到了同一张表中!!!!!
    建议拆分表!!
    ----------------------------------
    如果拆分表,就要联表查询生成hash值是不是更慢?
    是的,使update居多,就算一条语句0.05秒还是不可接受,所以我想有什么批处理或者入参为数组,但是又不定长,而且加入索引是不是会增加插入成本?
      

  11.   

    感觉数据库优化也难啊,就id,start_time,end_time,userName,subject这5个字段。提也只能把id,userNmae,subject做一个ID,另外就是ID,start_time,end_time.不过100条记录需要20秒,感觉挺慢的。就按20/100m来计算,也不应该在几分钟内把连接池中所有的连接消耗光啊,除非是数据库操作越来越快慢。我在自己的连接池做测试,5个连接,控制每秒50次的数据库操作,基本上程序运行良好。我用的是ORACLE,我觉得可以先优化数据的硬件资源和数据库本身配置的优化去提高数据库的处理速度。
      

  12.   

    fogs(菜鸟想飞):
    能给我看看你的部分代码马?
    我用的也是oracle,连接池是dhcp的,最大连接数500,用一个线程察看list,sleep300,list的更新达到0.2s,果真如你所说数据库操作是时快时慢,又是达到秒级
      

  13.   

    我在想是不是能做成批处理或者输入数组作为参数,否则我的list越来越大
      

  14.   

    自己维护一个记录主键的cache,明确地调用update或者insert
      

  15.   

    takecare(大厅) ( ) 信誉:139  2005-03-14 11:16:00  得分: 0  
     
     
       自己维护一个记录主键的cache,明确地调用update或者insert
      
     
    -----------能够告诉我具体的做法吗?
      

  16.   

    CallableStatement pstmt = null;
              try {              con = DbManager.getConnection();
                  long t11 = System.currentTimeMillis();
                  pstmt = con.prepareCall("{call p_single(?,?,?,?,?)}");
                  for(Iterator it=listDatas.iterator();it.hasNext();)
                  {
                    SerialCode sc=new SerialCode();
                    UserDataInfo UserData = (UserDataInfo) it.next();
                    pstmt.setString(1, (sc.getSerial("SIG")));
                    pstmt.setString(2, ((Single)UserData).getStartTime());
                    pstmt.setString(3, ((Single)UserData).getEndType());
                    pstmt.setString(4, ((Single)UserData).getSubject());
                    pstmt.setString(5, ((Single)UserData).getUserName());
                    pstmt.addBatch();
                  }
                  pstmt.executeUpdate();
                  long t12 = System.currentTimeMillis();
    System.out.println(t12-t11+"now stest ");          }
              catch( SQLException sqle ) {
                  sqle.printStackTrace();
                  throw sqle;
              }
              finally {
                  try {  pstmt.close(); }
                  catch (Exception e) {  }
                  try {  con.close();   }
                  catch (Exception e) { e.printStackTrace(); }
              }
    现在想用批处理,但是没用过,出现错误
    java.sql.SQLException: 批处理中出现错误: batch must be either executed or cleared
      

  17.   

    先在系统起来后,获取所有的表中记录
    HashSet existedSet在有新的更新或者插入请求s(最好也是批处理)到的时候,先从内存中比较是否已经存在
    if (request in existedSet) {
       add to update list;
    } else {
       add to insert list;
    }
      

  18.   

    这样不合适的,因为数据来源不是一个实例,也不是一台机器,那还是要起个线cheng不停遍历数据库,能不能帮我看看怎样修改上面的批处理的存储过程,另外我想优化数据库,要修改那几个参数?
    shared_pool_size = 52428800,而且数据库建了索引后更慢了,0.46s,
      

  19.   

    弄错了。最后是excutebatch();哈哈40条记录0.9s