首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Oracle驱动程序中发生OutOfMemoryError时,setFetchSize在PreparedStatement中

在Oracle驱动程序中发生OutOfMemoryError时,setFetchSize在PreparedStatement中
EN

Stack Overflow用户
提问于 2014-01-16 10:34:19
回答 1查看 2.6K关注 0票数 1

我有这段代码,这段代码基本上在PreparedStatement中设置了限制,以避免加载整个表数据。

代码语言:javascript
复制
PreparedStatement pstmt = null;
    ResultSet rs = null;
    try {
        pstmt = con.prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
        if (getDataSheet().isPagingEnabled()) {
            pstmt.setFetchSize(getDataSheet().getPageSize() + 1);
        }

        if (getDataSheet().isDisableTotalRowsCount() && maxRecords >= 0) {
            if (getDataSheet().isPagingEnabled()) {
                pstmt.setMaxRows(getCurrentPageSize());
            } else {
                pstmt.setMaxRows(maxRecords);
            }
        }

        //the rest of code.

    } catch(Exception ex) {
        //handle exception
    }

这段代码只适用于所有DB供应商,除非在PreparedStatement中使用PreparedStatement驱动程序中的一种情况,而且页面大小超过20000 --驱动程序抛出一个OutOfMemoryError

代码语言:javascript
复制
Caused by: java.lang.OutOfMemoryError: Java heap space
at oracle.jdbc.driver.PhysicalConnection.getCharBuffer(PhysicalConnection.java:7018)
at oracle.jdbc.driver.OracleStatement.prepareAccessors(OracleStatement.java:907)
at oracle.jdbc.driver.T4CTTIdcb.receiveCommon(T4CTTIdcb.java:261)
at oracle.jdbc.driver.T4CTTIdcb.receive(T4CTTIdcb.java:127)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:992)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:194)
at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:791)
at oracle.jdbc.driver.T4CPreparedStatement.executeMaybeDescribe(T4CPreparedStatement.java:866)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1186)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3387)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3431)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1203)

你知道甲骨文为什么会发生这种事吗?在DB级别有什么想法可以做吗?谢谢你的进阶。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-16 10:43:10

与您所认为的相反,setFetchSize并不限制检索的记录数量,它决定(或提示)驱动程序应该预取和缓存多少记录。例外是MySQL,它总是预取所有记录,除非您将提取大小设置为Integer.MIN_VALUE

驱动程序只需检索太多行,内存就会耗尽。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21159263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档