2017-08-18 47 views
3

我使用帶存儲過程的CallableStatement讀取數據,ResultSet有12000行,處理時間爲30秒。我已經嘗試設置獲取大小(rs.setFetchSize(500),但儘管如此,它走的是同一時間獲取整個數據(30秒)。JDBC ResultSet方法next()花費30秒來獲取12000行

callableStatement = conn.prepareCall(myProc); 
callableStatement.setString("myParam", xyz); 
callableStatement.registeroutputParameter("REVTAL", OracleTypes.CURSOR); 
callableStatement .setFetchSize(1000); // I have tried with different values 
rs = (ResultSet) callableStatement.getObject("REVTAL"); 

while(rs.next()) {` 
    myMethodToSetResultIntoList(); 
} 

是否有任何可能的方式以外提取大小優化?它

我已經試過這樣:

while(rs.next()) {` 
     logger(); // do nothing 
    } 

它處理了12000行中大約3秒,所以時間是從的resultSet獲取數據得到消耗

而且,這我。確認setfetchSize()工作正常,因爲沒有設置fetch Size,它將「fetchedRowCount」顯示爲10,並將setFetchSize()顯示爲x,它在調試模式下顯示「fetchRowCount」爲x。

實際while循環是這樣的:

while(rs.next()) { 
    Myclass mc = new Myclass(); 
    mc.setA(rs.getString("parameterA"); 
    mc.setB(String.valueOf(rs.getLong("parameterB"); 
    //4 more string parameters same 
    mc.setG(myMethodToConvertDate(rs.getDate("Date"); 
    myList.add(mc); 
} 

所以它走大約25秒檢索ResultSet中的數據,並補充說,到myList中。必須有解決方案。

在此先感謝

+0

我想你只有一個返回值,即'CURSOR'。所以'setFetchSize()'不會有任何效果,因爲它只加載一行......嘗試類似'SELECT * FROM「myProc」(?)' –

+1

[使用JDBC for Oracle迭代ResultSet需要大約16秒的時間?](https://stackoverflow.com/questions/17744090/iterating -a-resultset-using-the-jdbc-for-oracle-take-a-lot-of-time-about-16s) – phaze0

+0

我認爲setFetchSize()工作正常,我已經嘗試調試我的代碼,並在rowCount它實際上是顯示我在setFetchSize()中設置的數字。 –

回答

0

有關fetchSize的一點說明。在你的代碼中有一個帶有out參數和CURSOR的CallableStatement。 SetFetchSize對CallableStatement沒有影響,因爲它只返回一組結果,out參數。在這種情況下,只有一個輸出參數CURSOR。 getCursor調用返回一個ResultSet。

最好我記得在JDBC規範中沒有什麼說明從CURSOR創建的ResultSet的fetchSize應該是什麼。 (我的內存不穩定。)Oracle數據庫JDBC驅動程序將CURSOR ResultSet的fetchSize設置爲與創建它的Statement相同。

因此,在這種情況下,設置Call​​ableStatement的fetchSize對CallableStatement檢索的結果沒有任何影響,但它確實設置了從CURSOR創建的ResultSet的fetchSize。因此,Usagi Miyamoto的評論至少在CallableStatement方面是正確的,但是您看到設置fetchSize的預期行爲的評論也是正確的。

對CURSOR ResultSet進行迭代從數據庫中獲取所有數據。你聲明這需要約3秒鐘。處理行時,大約需要20秒。設置fetchSize不會加快(或減慢)行處理速度,只會提高數據庫讀取速度。因此,在限制設置fetchSize不會加快速度。 (這些限制是fetchSize必須足夠大,以最大限度地減少數據庫往返次數,並且足夠小以保持內存佔用空間合理.100通常是一個很好的數字。很少會有更好的數字。)

但是,對於1000的fetchSize,您的代碼將在3秒內獲取所有行。 100可能會讓您的應用程序運行速度更快,因爲它使用的內存更少,但這是次要問題。你真正的問題是爲什麼處理12,000行需要17秒?不抓取它們,而是處理它們。這是列的數量和類型及其處理方式的函數。你沒有提供這方面的任何信息。