簡體   English   中英

用jdbc和mysql並行化查詢是否值得?

[英]Is it worth to parallelize queries with jdbc and mysql?

一個jdbc“ select”語句需要5秒鍾才能完成。 因此,執行5條語句需要25秒。

現在,我嘗試並行完成這項工作。 該數據庫是帶有innodb的mysql。 我開始5個線程,並給每個線程自己的數據庫連接。 但是,完成所有任務還需要25秒嗎?

請注意,我為Java提供了足夠的堆,並具有8個內核,但只有一個hd(這里的瓶頸可能只有一個hd?)

這是mysql開箱即用的預期功能嗎? 這是示例代碼:

public void doWork(int n) {
        try (Connection conn = pool.getConnection();
             PreparedStatement stmt = conn.prepareStatement("select id from big_table where id between "+(n * 1000000)" and " +(n * 1000000 +1000000));
        ) { 
            try (ResultSet rs = stmt.executeQuery();) {
                while (rs.next()) {
                    Long itemId = rs.getLong("id");
                }
            }
        }
}

public void doWorkBatch() {
    for(int i=1;i<5;i++)
        doWork(i);
}

public void doWorkParrallel() {
    for(int i=1;i<5;i++)
        new Thread(()->doWork(i)).start();
    System.console().readLine();
}

(我不記得在哪里,但我讀到標准的mysql安裝可以輕松地並行處理1000個連接)

這取決於系統瓶頸在哪里。如果每個查詢花費幾秒鍾來建立與數據庫的連接,而實際運行查詢的只是其中的一小部分,您會看到一個不錯的改進。 但是,如果花時間在mysql上,並運行實際的查詢,則不會有太大的區別。

我要做的第一件事不是優化並發執行,而是優化查詢,也許將索引添加到表中,等等。

並發執行可能會更快。 您還應該考慮批量執行。

如果有並行處理的空間,並發執行將有所幫助。 在您的情況下,似乎沒有並行化的空間,因為您有一個非常簡單的查詢,該查詢執行順序讀取大量數據,因此,瓶頸可能是磁盤傳輸,然后是從服務器到服務器的數據傳輸。客戶。

當我們說RDBMS服務器每秒可以處理數千個請求時,我們通常是在談論我們通常在Web應用程序中看到的那種請求,其中每個SQL查詢都比您的查詢稍微復雜一些,但磁盤讀取量卻少得多(因此它們很可能會在緩存中找到)和較小的數據傳輸(適合網頁的內容)。

看着您的問題肯定是多線程的,這將改善您的性能,因為即使我曾經通過完全按照您的想法進行操作,將4-5小時的批處理作業轉換為7-10分鍾的作業,但您需要先了解以下內容設計時需要手:

1)您需要考慮任務間的依賴性,即任務在不同線程上執行。

2)使用連接池是一個好兆頭,因為在Java中創建數據庫連接是一個緩慢的過程,需要很長時間。

3)每個線程都需要自己的JDBC連接。 連接不能在線程之間共享,因為每個連接也是事務。

4)將任務分為幾個工作單元,每個單元執行一項工作。

5)特別適合您的情況,即使用mysql。 您使用的數據庫引擎也會影響性能,因為InnoDB引擎使用行級鎖定。 這樣,它將處理更高的流量。 但是,(通常)替代方法(MyISAM)不支持行級鎖定,它使用表鎖定。 我正在談論這種情況,如果另一個線程進入並想在第一個線程提交之前更新同一行該怎么辦。

6)為了提高Java數據庫的性能,應用程序正在使用setAutoCommit(false)運行查詢。 默認情況下,新的JDBC連接的自動提交模式為ON,這意味着每個單獨的SQL語句將在其自己的事務中執行。 在沒有自動提交的情況下,您可以將SQL語句分組為邏輯事務,可以通過調用commit()或rollback()來提交或回滾該邏輯事務。

您還可以簽出專為批處理而設計的springbatch。

希望這可以幫助。

暫無
暫無

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

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