0

我正在使用 JDBC 准备语句进行批量插入。我正在调用ps.execute()方法。如果失败,那么我将调用一个方法,在该方法中传递参数列表和准备好的语句。我正在使用merge sort technique to divide the list然后尝试插入记录,但没有成功。

这是我的代码;

从我正在调用的 executePrepareStatement 方法

this.executeInsertStatement(query, myCollection, 0, myCollection.size());

// 执行插入语句方法

public void executeInsertStatement1(String query, List myCollection, int sIndx, int eIndx) throws DBException,SQLException {

        int startIndx = sIndx, endIndx =  eIndx, mid = 0;

        try {
            try{
                if(conn.isClosed())
                    new DataService(CoreConstants.TARGET);
            } catch (Exception e) { }           
            if(startIndx >= endIndx) {
                return;
            }           
            conn.setAutoCommit(false);
            if (query != null) {
                mid = (startIndx + endIndx) / 2;
                ps = conn.prepareStatement(query);
                executeInsertStatement(query, myCollection, startIndx, mid);
                executeInsertStatement(query, myCollection, mid+1, endIndx);
                //int end_low = mid;
                //int start_high = mid + 1;
                if(mid < endIndx)
                    endIndx = mid;
                for (int i = 0; i < endIndx; i++) {
                    List list = (List) myCollection.get(i);
                    int count = 1;      
                    for (int j = 0; j < list.size(); j++) {
                        if(list.get(j) instanceof Timestamp) {
                            ps.setTimestamp(count,  (Timestamp) list.get(j));       
                        } else if(list.get(j) instanceof java.lang.Character) {
                            ps.setString(count, String.valueOf(list.get(j)));
                        }
                        else {
                            ps.setObject(count, list.get(j));
                        }
                        count++;
                    }
                    try {
                        ps.execute();   
                    } catch (Exception e) {
                        rollback();
                    }                   
                }
            }
        } catch (Exception e) {
            rollback();
        } finally{ 
            try {
                if (ps != null) {
                    ps.close();
                    ps = null;
                }
            } catch (Exception ex) {
            }
        }
    }

谢谢

4

1 回答 1

1

我不认为您使用合并排序走在正确的轨道上。我了解您正在尝试使用分而治之的概念来实现您的解决方案,但我认为您使问题变得比实际需要的更难(并且更令人困惑/复杂)。

如果我理解正确,您有一个数据集,您想插入到您的数据库中。你会想批量做。PreparedStatement 让您使用几个简洁的方法来做到这一点:addBatch()executeBatch()

以下是我将如何尝试实现您的要求的概述:

  • 当我想执行批处理时,我会设置批处理限制,即批处理中的语句数。除非我达到这个限制(我可以通过使用计数器很好地跟踪),否则我会继续添加到批次中

  • 一旦达到限制,我执行批处理,重置计数器,清除批处理并重做步骤 #1

  • 这将一直持续到我完成整个数据集为止。最后,根据我的要求,我将通过将数据提交到数据库甚至执行回滚来结束。

看看这个答案,看看你如何着手和实施这个例子。

于 2012-11-05T09:47:54.620 回答