您好,登錄后才能下訂單哦!
本篇文章為大家展示了怎么在MySQL中使用流式查詢避免數據OOM,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
使用JDBC的PreparedStatement/Statement
的setFetchSize
方法設置為Integer.MIN_VALUE
或者使用方法Statement.enableStreamingResults()
可以實現流式查詢,在執行ResultSet.next()
方法時,會通過數據庫連接一條一條的返回,這樣也不會大量占用客戶端的內存。
public int execute(String sql, boolean isStreamQuery) throws SQLException { Connection conn = null; PreparedStatement stmt = null; ResultSet rs = null; int count = 0; try { //獲取數據庫連接 conn = getConnection(); if (isStreamQuery) { //設置流式查詢參數 stmt = conn.prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); stmt.setFetchSize(Integer.MIN_VALUE); } else { //普通查詢 stmt = conn.prepareStatement(sql); } //執行查詢獲取結果 rs = stmt.executeQuery(); //遍歷結果 while(rs.next()){ System.out.println(rs.getString(1)); count++; } } catch (SQLException e) { e.printStackTrace(); } finally { close(stmt, rs, conn); } return count; }
「PS」:上面的例子中通過參數isStreamQuery
來切換「流式查詢」與「普通查詢」,用于下面做測試對比。
創建了一張測試表my_test
進行測試,總數據量為27w
條,分別使用以下4個測試用例進行測試:
大數據量普通查詢(27w條)
大數據量流式查詢(27w條)
小數據量普通查詢(10條)
小數據量流式查詢(10條)
@Test public void testCommonBigData() throws SQLException { String sql = "select * from my_test"; testExecute(sql, false); }
3.1.1. 查詢耗時
27w 數據量用時 38 秒
3.1.2. 內存占用情況
使用將近 1G 內存
@Test public void testStreamBigData() throws SQLException { String sql = "select * from my_test"; testExecute(sql, true); }
3.2.1. 查詢耗時
27w 數據量用時 37 秒
3.2.2. 內存占用情況
由于是分批獲取,所以內存在30-270m波動
@Test public void testCommonSmallData() throws SQLException { String sql = "select * from my_test limit 100000, 10"; testExecute(sql, false); }
3.3.1. 查詢耗時
10 條數據量用時 1 秒
@Test public void testStreamSmallData() throws SQLException { String sql = "select * from my_test limit 100000, 10"; testExecute(sql, true); }
3.4.1. 查詢耗時
10 條數據量用時 1 秒
上述內容就是怎么在MySQL中使用流式查詢避免數據OOM,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。