要实现的功能:从一个数据库里取数据,然后插入另一个数据库里。在main方法调用后可以运行,但运行速度随时间增长变慢,最初迁移一条主表数据(包括其下的明细表)需要5秒,到后边需要50秒还多,不知道原因在哪?为实现功能用到了2个for循环,第一个for先遍历原始主表数据,取其中一条,再根据这一条数据的SONO号获取原始明细表数据,第二个for遍历明细表并插入到我方明细表中。插完一条主表和其下的明细表,再插另一条主表以及明细,如此循环。其中用到了多个list和String[].public class Transfer {
public void AlldataChange() throws Exception {
Dbcon db = new Dbcon();//连接ebio数据库
Dbconn db1 = new Dbconn();//连接long数据库
Statement stmt = db.getConnection().createStatement();
Statement stmt1 =db1.getConnection().createStatement();
String sql = "select* from ...";// 查询对方主表数据
ResultSet rs = stmt.executeQuery(sql);
List<String[]> l1 = new ArrayList<String[]>();
List<String[]> l2 = new ArrayList<String[]>();
while (rs.next()) {
String[] s = new String[21];//定义数组s存放QAD主表数据
s[0] = rs.getString("sono");
         .....
                           .....
s[20] = rs.getString("drafter");
l1.add(s);//把从QAD按条件查询的主表数据封装到集合l1里面。
}
for(Iterator<String []> it=l1.iterator();it.hasNext();) {// 遍历主表的每一条数据
String[] s1 = (String[])it.next();//定义数组s1获取l1集合中的值
String sono = s1[0];
ResultSet mxrs = stmt.executeQuery("select ... from ...");// 根据主表数据的合同号码,查询对方明细数据
while (mxrs.next()) {
String[] s2 = new String[6];//定义数组s2存放QAD明细表的数据
s2[0] = mxrs.getString("sono");
s2[1] = mxrs.getString("line");
s2[2] = mxrs.getString("itemno");
s2[3] = mxrs.getString("qty");
s2[4] = mxrs.getString("soprice");
s2[5] = mxrs.getString("soamt");
l2.add(s2);//把从QAD按条件查询的明细表数据封装到集合l2里面。
}
// 查询己方主表是否存在此数据,一共17个字段
ResultSet rs1 = stmt1.executeQuery("select ...");
try {
if (rs1!=null) { // 如果我方主表存在相同数据
stmt1.executeUpdate("delete from ..");// 删除主表数据
stmt1.executeUpdate("delete from..");// 删除明细表数据
// 插入主表数据
                                             stmt1.executeUpdate("insert into ...");
// 插入明细表数据
for(Iterator<String []> it1=l2.iterator();it1.hasNext();) {
String[] s3 = (String[])it1.next();//定义数组s3获取l2集合的值 stmt1.executeUpdate("insert into ...");}  }else{}System.err.println("合同号为" + s1[0] + "的数据迁移完毕");
} catch (Exception e) {e.printStackTrace();} 
}
System.out.println("外销合同的所有数据导入完毕");
System.exit(0);
}
}

解决方案 »

  1.   

    有索引。合同号为LC10FI-MODFI008的数据迁移完毕
    合同号为LC10FR-BMOFR001的数据迁移完毕
    合同号为LC10FR-BMOFR002的数据迁移完毕出来一条要等很久。
      

  2.   

    如果把以下注释掉,不管运行多久,速度都刷刷快// 插入明细表数据
    for(Iterator<String []> it1=l2.iterator();it1.hasNext();) {
    String[] s3 = (String[])it1.next();//定义数组s3获取l2集合的值 stmt1.executeUpdate("insert into ...");} }else{}System.err.println("合同号为" + s1[0] + "的数据迁移完毕");
    } catch (Exception e) {e.printStackTrace();}