2016-04-15 37 views
0

我的Java應用程序從CSV文件中讀取行並將其放入數據庫(Apache Derby)中。我想實現批量插入,因爲我插入了數千條記錄,所以我想要提高性能。但是,數據的插入方式取決於數據庫中已存在的數據,例如我想批以下插入:如何在插入取決於準備批處理的數據時批量插入

INSERT INTO user (name) VALUES (?); 

但後來,我只是執行上面的,如果下面不返回任何數據:

SELECT * FROM user WHERE name='Tim'; 

如果我批量插入,然後我的選擇可能不找到最近的數據,因爲它正在等待批處理。

任何人都可以確定一個解決方案嗎?也許是一個緩存機制?

回答

1

一個簡單的選擇是讓你的批處理條目INSERT/SELECT語句,這樣只有滿足查詢條件時纔會發生插入。

這將是這樣的:

Lists<String> usernames = new ArrayList<>(); 
//.... data in list assumed 
for(String username: usernames) { 
    statement.addBatch("INSERT INTO USER(NAME) SELECT '" + username+ "' FROM USER WHERE NOT EXISTS(SELECT 1 FROM USER WHERE NAME = '" + username + "')"); 
} 

這將讓數據庫來處理檢查是否插入記錄存在與否。 對應的每個語句都已經存在於數據庫中,它們將不會被插入,並且它的返回計數將爲0.但是,您無論如何都不會在乎。

我很快搜索並看到Derby顯然支持INSERT/SELECT功能。你可以在這裏找到關於這個語法的更多信息:https://db.apache.org/derby/docs/10.0/manuals/reference/sqlj40.html