[英]Java-MySQL: How to create a Stored Procedure
我使用Mysql處理Java 1.7項目,
我有一種方法,可以在帶有PreparedStatement的表中插入大量數據,但這會在GlassFish Server中導致內存不足錯誤。
Connection c = null;
String query = "INSERT INTO users.infos(name,phone,email,type,title) "
+ "VALUES (?, ?, ?, ?, ?, ";
PreparedStatement statement = null;
try {
c = users.getConnection();
statement = c.prepareStatement(query);
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try{
int i =0;
for(Member member: members){
i++;
statement.setString(1, member.getName());
statement.setString(2, member.getPhone());
statement.setString(3, member.getEmail());
statement.setInt(4, member.getType());
statement.setString(5, member.getTitle());
statement.addBatch();
if (i % 100000 == 0){
statement.executeBatch();
}
}
statement.executeBatch();
}catch (Exception ex){
ex.printStackTrace();
} finally {
if(c != null)
{
try {
c.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(statement != null){
try {
statement.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
c = null;
statement = null;
}
我認為我需要創建一個存儲過程來避免出現此內存問題,但是我不知道從哪里開始,是否應該創建過程或函數,以及是否能夠在程序中獲得某種響應。返回還是什么?
你怎么看待這件事?
用對預准備語句中存儲過程的調用替換預准備語句中的插入語句不會以任何有意義的方式影響內存消耗。
您正在用光內存,因為您正在使用非常大的批處理大小。 您應該測試不同批次大小的性能-您會發現,批次大小大於幾十到數百時,較大批次的性能改進會迅速減少。
通過使用load data infile
您可能能夠獲得更高的輸入速率。 您將需要處理多行數據,創建一個文本文件並加載該文件。 例如,請參閱此問題 。
您也可以考慮並行化。 例如,打開多個連接,並使用單獨的線程向每個連接插入行。 同樣,您可以嘗試使用load data infile
進行並行加載。
您將必須在硬件設置上嘗試各種技術,批處理大小,線程數(每個內核最多不超過一個)等,以查看提供最佳性能的方法。
您可能還需要查看調整一些MySQL參數,刪除(以及稍后重新創建)索引等問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.