2015-10-13 50 views
0

我的問題與表中記錄數量巨大的JDBC查詢有關。最終目標是通過流式傳輸方式從數據庫獲取數據,您可以通過塊獲取數據塊。從數據庫中獲取數據塊以節省內存

這可以通過關鍵詞(如LIMIT,OFFSET)創建多個SQL語句來實現。但在這種情況下,將會有多個數據庫調用會花費更多時間。 有沒有一種方式,你不加載整個結果設置到內存中&可以在沒有額外的數據庫調用的情況下以塊的形式獲取數據?

感謝

回答

2

首先,如果你是從數據庫中獲取的數據塊,你會做多個數據庫調用。您將不會執行儘可能多的查詢。

二,是的,這是可能的。有一個數據庫概念被稱爲「光標」。

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(); 

注意,當執行查詢的數據庫將已經賺得了所有行,直到你關閉遊標的結果集將佔用數據庫內存。請記住,數據庫是共享資源。

+0

在這種情況下,數據庫表,如果它有1十萬行,所有這些都沒有提取到內存中,一次只提取50,是嗎?其餘的數據是使用進一步的Sql查詢獲得的?我的意思是JDBC驅動程序如何獲取其餘數據? –

+0

而我的主要目標是減少應用程序佔用的內存。這是在這裏實現的嗎?你最後的陳述意味着所有的行都被提取。你能澄清一點點嗎? –

+0

是的。在Java中迭代結果集時。 – sh0rug0ru