簡體   English   中英

非常快地將許多行插入Oracle數據庫

[英]Insert many rows to Oracle Database very fast

我需要非常快速地將許多sql行插入到oracle數據庫中。 IndexData是包含要插入到Oracle數據庫中的保存方法的類。

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中插入一行。 還有沒有其他比這更快的方法了。 任何建議將不勝感激。

看看PreparedStatement.addBatchPreparedStatement.executeBatch您可以創建單個准備好的語句,添加多組執行參數,然后執行批處理。 不過,您可能希望每批選擇一些插入,以限制在內存中累積的“待處理”工作量。

這將永遠無法很好地擴展,但是取決於需要加載多少條記錄。 通常,更好的選擇是將直接路徑加載與sql加載器一起使用,並可能並行加載。

我在您的設計中感到難聞的氣味,例如您的實體對象負責創建和關閉prepare語句,數據庫連接為“全局”等。

您可以通過以下幾種常見方式進行調查:

  1. 僅執行一次prepare語句,並將其用於多次更新
  2. 使用批量插入/更新

但是,兩種方法都需要您重新設計(但我認為這樣做是值得的)。

(而且,如果要發布代碼,請確保正確縮進。現在只是一團糟)

您可以做的一件事是將查詢寫入文件,然后在單獨的線程中將文件加載到DB中。 這是因為您所有的查詢都只是插入查詢。 這有一個小問題,盡管如果文件加載失敗,那么您不知道它出了錯。 我想,這樣可以減少內存占用並更快地工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM