非常快速地向Oracle数据库插入许多行

时间:2011-11-15 07:23:54

标签: java sql oracle jdbc

我需要非常快速地将许多sql行插入到oracle数据库中。 IndexData是包含要插入到oracle数据库的save方法的类。

while ((line = in.readLine()) != null) {
    if(line.contains("numDocs")) {
        numDocs = in.readLine().trim();
//For Inserting 
IndexData id = new IndexData(timeStamp, 1, 2, numcDocs);
id.save();
    }  else if(line.contains("indexSize")) {
        indexSize = in.readLine().trim();
//For Inserting 
IndexData id = new IndexData(timeStamp, 1, 3, indexSize);
id.save();
        } else if(line.contains("indexReplicatedAt")) {
   replicationTime = in.readLine().trim();           
//For Inserting         
IndexData id = new IndexData(timeStamp, 1, 4, replicationTime );
id.save();
    } 
    }

    BufferedReader inUrl   = new BufferedReader (new InputStreamReader (isUrl));
    String lineUrl;
    Pattern regex = Pattern.compile("<str name=\"status\">(.*?)</str>");

    while ((lineUrl = inUrl.readLine()) != null) {
    if(lineUrl.contains("str name=\"status\"")) {
        Matcher regexMatcher = regex.matcher(lineUrl);
        if (regexMatcher.find()) {
        status = regexMatcher.group(1);
//For Inserting
IndexData id = new IndexData(timeStamp, 1, 5, status);
id.save();
        }                   


}  
}

这是我的IndexData类 -

public IndexData(String timestamp, String serveId, String informationId, String value ) {
this.timestamp=timestamp;
this.serverId=serverId;
this.informationId=informationId;
this.value=value;
}
//For Inserting
public void save() throws SQLException {

ps = DataSource.conn.prepareStatement (
"INSERT INTO table(timestamp, serverId, informationId, value) VALUES(?,?,?,?)");

ps.setString (1, timestamp);
ps.setString (2, serverId);
ps.setString (3, informationId);
ps.setString (4, value);

ps.executeUpdate();
ps.close ();
}

这是插入到具有多个用于插入的多个sql语句的oracle数据库的最佳方式。因为我一次又一次地打开IndexData类,因为每个信息只向DB插入一行。有没有比这更快的其他方式。任何建议将不胜感激..

4 个答案:

答案 0 :(得分:6)

查看PreparedStatement.addBatchPreparedStatement.executeBatch - 您可以创建一个预准备语句,添加几组参数以供执行,然后执行批处理。您可能希望每批选择一定数量的插入,限制在内存中构建的“待处理”工作量。

答案 1 :(得分:2)

这永远不会很好地扩展,但它取决于需要加载多少条记录。通常,更好的选择是使用sql loader直接路径加载并且可能并行加载。

答案 2 :(得分:1)

我觉得你的设计很难闻,就像你的实体对象负责创建和关闭prepare语句,数据库连接是“全局”等。

您可以通过以下方式了解一下:

  1. 仅执行一次prepare语句并将其用于多次更新
  2. 使用批量插入/更新
  3. 但是,这两种方式都需要您重新审视您的设计(但我认为值得这样做)。

    (并且,如果您要发布您的代码,请确保您正确缩进它。现在只是一团糟)

答案 3 :(得分:0)

您可以做的一件事是将查询写入文件并在单独的线程中将文件加载到DB中。 这是因为你的所有quires都只是插入查询。这有一个小故障虽然如果加载文件失败那么你不知道它的错误。通过这种方式可以减少内存占用量并且工作速度更快是我猜的。