0
我的問題與表中記錄數量巨大的JDBC查詢有關。最終目標是通過流式傳輸方式從數據庫獲取數據,您可以通過塊獲取數據塊。從數據庫中獲取數據塊以節省內存
這可以通過關鍵詞(如LIMIT,OFFSET)創建多個SQL語句來實現。但在這種情況下,將會有多個數據庫調用會花費更多時間。 有沒有一種方式,你不加載整個結果設置到內存中&可以在沒有額外的數據庫調用的情況下以塊的形式獲取數據?
感謝
我的問題與表中記錄數量巨大的JDBC查詢有關。最終目標是通過流式傳輸方式從數據庫獲取數據,您可以通過塊獲取數據塊。從數據庫中獲取數據塊以節省內存
這可以通過關鍵詞(如LIMIT,OFFSET)創建多個SQL語句來實現。但在這種情況下,將會有多個數據庫調用會花費更多時間。 有沒有一種方式,你不加載整個結果設置到內存中&可以在沒有額外的數據庫調用的情況下以塊的形式獲取數據?
感謝
首先,如果你是從數據庫中獲取的數據塊,你會做多個數據庫調用。您將不會執行儘可能多的查詢。
二,是的,這是可能的。有一個數據庫概念被稱爲「光標」。
Connection cn = //..
// Very important - JDBC default is to commit after every statement
// which will cause DB to close the cursor
cn.setAutoCommit(false);
Statement st = cn.prepareStatement("SELECT * FROM TBL_FOO");
// Cache 50 rows at the client at a time
st.setFetchSize(50);
ResultSet rs = st.executeQuery();
while (rs.next()) {
// Move the cursor position forward - moving past cached rows triggers another fetch
}
rs.close();
st.close();
注意,當執行查詢的數據庫將已經賺得了所有行,直到你關閉遊標的結果集將佔用數據庫內存。請記住,數據庫是共享資源。
在這種情況下,數據庫表,如果它有1十萬行,所有這些都沒有提取到內存中,一次只提取50,是嗎?其餘的數據是使用進一步的Sql查詢獲得的?我的意思是JDBC驅動程序如何獲取其餘數據? –
而我的主要目標是減少應用程序佔用的內存。這是在這裏實現的嗎?你最後的陳述意味着所有的行都被提取。你能澄清一點點嗎? –
是的。在Java中迭代結果集時。 – sh0rug0ru