0
我想从oracle
导出大量数据到csv文件。所以我用简单的JDBC
选择语句来获取内存中的数据,然后将其写入文件,但数据是非常大的我越来越内存异常。所以我想用CallableStatement
调用存储过程将返回CURSOR
与ResultSet
如下的: -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到文件,因此不会得到内存不足的问题,任何其他的方法呢?
由于要求,我无法在此条件下使用分页。
:这可以验证或通过标准的JDBC设置其他值。所以我们可以节省内存。 –
在循环中正常选择和写入会导致内存不足。您可能需要考虑发布一个问题以及原始问题,并使用完整的代码编写此代码。 –