我正在尝试从sybase服务器读取表,处理行,并将结果输出到另一个表。 (下面是我的代码)

代码非常快地检索表并进行同样快速的处理(到达30秒内发送到该表的部分)。但是,当我运行execute batch时,它会在完成前坐在那儿20分钟(仅供引用,我有一个正在测试8400行的表)。

有没有更有效的方法可以做到这一点?我可以接受或发送查询(我可以创建新表,更新表等)的方式很满意-我只是不知道为什么它这么慢(我敢肯定数据
注意:这对我来说真的很不好的原因是我必须解析一个包含1.2 MM行的表(我现在正在使用的该表是一个具有8400行的测试表)

    Connection conn = DriverManager.getConnection(conString, user, pass);


    String sql = "SELECT id,dateid,attr from user.fromtable";
    Statement st = conn.createStatement();
    ResultSet rs = st.executeQuery(sql);

    String sqlOut = "INSERT INTO user.mytabletest (id,attr,date,estEndtime) values (?,?,?,?)";
    PreparedStatement ps = conn.prepareStatement(sqlOut);

    int i=1;

    while(rs.next())
    {
        int date = rs.getInt("dateid");
        String attr = rs.getString("attr");
        String id = rs.getString("id");

        Time tt = getTime(date,attr);
        Timestamp ts = new Timestamp(tt.getTime());

        ps.setString(1, id);
        ps.setString(2, attr);
        ps.setInt(3, date);
        ps.setTimestamp(4, ts);
        ps.addBatch();

        if(i % 10000 == 0)
        {
            System.out.println(i);
            ps.executeBatch();
            conn.commit();
            ps.clearBatch();
        }

        i++;
    }
    System.out.println("sending "+(new Date()));
    int[] results = ps.executeBatch();
    System.out.println("committing "+(new Date()));
    conn.commit();
    System.out.println("done "+(new Date()));

最佳答案

为了有效地使用批处理,您应该关闭AutoCommit选项,然后在执行批处理后将其打开(或者使用connection.commit()方法)

connection.setAutoCommit(false);
while(rs.next())
    {
     .....
     ps.addBatch();
    }
int[] results = ps.executeBatch();
connection.setAutoCommit(true);

10-07 16:44