2016-03-08 100 views
0

我想从oracle导出大量数据到csv文件。所以我用简单的JDBC选择语句来获取内存中的数据,然后将其写入文件,但数据是非常大的我越来越内存异常。所以我想用CallableStatement调用存储过程将返回CURSORResultSet如下的: -JDBC CallableStatement存储过程CURSOR结果集获取

String getDBTableCursorSql = "{call getDBTableCursor(?,?)}"; 
callableStatement = dbConnection.prepareCall(getDBTableCursorSql); 
callableStatement.setString(1, "test"); 
callableStatement.registerOutParameter(2, OracleTypes.CURSOR); 

// execute getDBTableCursorSqlstore procedure 
callableStatement.executeUpdate(); 

// get cursor and cast it to ResultSet 
rs = (ResultSet) callableStatement.getObject(2); 

// loop it like normal 
while (rs.next()) { 
    String userid = rs.getString("ID"); 
    String userName = rs.getString("NAME"); 
.. 
.. 
} 

甲骨文PROC: -

CREATE OR REPLACE PROCEDURE getDBTableCursor(
      p_username IN DBUSER.USERNAME%TYPE, 
      c_dbuser OUT SYS_REFCURSOR) 
    IS 
    BEGIN 

     OPEN c_dbuser FOR 
     SELECT * FROM CUSTOMER WHERE USERNAME LIKE p_username || '%'; 

    END; 

问题1: - 做上述ResultSet将取所有的数据在单枪中?或将进入数据库中的每个rs.next()

问题2: - 是有能处理大数据导出使用大块的Java到文件,因此不会得到内存不足的问题,任何其他的方法呢?

由于要求,我无法在此条件下使用分页。

+0

:这可以验证或通过标准的JDBC设置其他值。所以我们可以节省内存。 –

+0

在循环中正常选择和写入会导致内存不足。您可能需要考虑发布一个问题以及原始问题,并使用完整的代码编写此代码。 –

回答