[英]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.addBatch
和PreparedStatement.executeBatch
您可以創建單個准備好的語句,添加多組執行參數,然后執行批處理。 不過,您可能希望每批選擇一些插入,以限制在內存中累積的“待處理”工作量。
這將永遠無法很好地擴展,但是取決於需要加載多少條記錄。 通常,更好的選擇是將直接路徑加載與sql加載器一起使用,並可能並行加載。
我在您的設計中感到難聞的氣味,例如您的實體對象負責創建和關閉prepare語句,數據庫連接為“全局”等。
您可以通過以下幾種常見方式進行調查:
但是,兩種方法都需要您重新設計(但我認為這樣做是值得的)。
(而且,如果要發布代碼,請確保正確縮進。現在只是一團糟)
您可以做的一件事是將查詢寫入文件,然后在單獨的線程中將文件加載到DB中。 這是因為您所有的查詢都只是插入查詢。 這有一個小問題,盡管如果文件加載失敗,那么您不知道它出了錯。 我想,這樣可以減少內存占用並更快地工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.