2016-11-25 28 views
1

嗨我試圖從MYSQL數據庫中的表中的一個表中獲取50K +行。花費20多分鐘才能檢索所有數據並將其寫入文本文件。我可以使用多線程來縮短這個獲取時間並使代碼更有效率。任何幫助將不勝感激。如何使用多線程來獲取mysql中的數據

我已經使用普通的JDBC連接和ResultSetMetaData從表中提取行。

String row = ""; 
    stmt = conn.createStatement(); 
    ResultSet rs = stmt.executeQuery("select * from employee_details"); 
    ResultSetMetaData rsmd = rs.getMetaData(); 
    int columnCount = rsmd.getColumnCount(); 
while (rs.next()) { 
     for (int i = 1; i < columnCount; i++) { 
      row = row + rs.getObject(i) + "|";// check 
     } 
     row = row + "\r\n"; 
    } 

而我正在寫文本文件中提取的值如下。

BufferedWriter writer = new BufferedWriter(new FileWriter(
    "C:/Users/430398/Desktop/file/abcd.txt")); 
    writer.write(row); 
    writer.close(); 
+1

我不認爲多線程會加速這一切。想想瓶頸在哪裏 - 瓶頸是否會影響到這一點? –

+0

但嘗試它並觀察會發生什麼沒有什麼壞處 - 你在實驗中發現了什麼? –

+0

我已經嘗試使用簡單的JDBC連接和resultmetadata來獲取值。這需要20分鐘。我不確定多線程是否可以在這裏工作 –

回答

0

首先你需要確定瓶頸在哪裏。它是SQL查詢嗎?或者通過ResultSet獲取行?或者是巨大的弦的建設?或者也許寫文件?

您需要測量上述算法的各個部分的持續時間,並告訴我們結果。如果沒有這方面的知識,就無法說明如何加快算法。

+0

使用ResultSet獲取數據所花費的時間比寫入文件要花費很多時間。我正在考慮在SQL中使用批處理(使用OFFSET)來縮短獲取時間。 –

+0

您是否嘗試在沒有構建巨大字符串的情況下進行讀取? – Michal

+0

問題在於建造巨大的String。我使用了StringBuilder,數據在2秒內被提取。 –

1

請記住,rs.next將以n批從數據庫中讀取結果。其中n是由JDBC實現定義的數字。我認爲它現在在10。因此,每10個批次就會再次查詢數據庫,因此會出現網絡開銷 - 即使它位於同一臺機器上。

只是增加這個數字將導致更快的加載時間。

編輯: 加入這個 stmt.setFetchSize(50000); 可能是這樣。

請注意,這會導致內存消耗過多。

+0

我試過添加stmt.setFetchSize(50000);但仍需要19分鐘才能獲取數據。 –

+0

@BasheerAhmed:但這比20+分鐘還好。 –

+0

@HovercraftFullOfEels對不起,困惑。 20分鐘以上是21分45秒左右。 –

相關問題