首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SimpleJdbcCall忽略JdbcTemplate获取大小

SimpleJdbcCall忽略JdbcTemplate获取大小
EN

Stack Overflow用户
提问于 2010-03-09 15:24:32
回答 3查看 9.4K关注 0票数 4

我们通过Spring调用pl/sql存储过程,SimpleJdbcCall忽略了在JdbcTemplate上设置的SimpleJdbcCall。尽管我们已将jdbctemplate fetchsize设置为200,但rowmapper结果集提取大小仍设置为10。你知道为什么会发生这种情况以及如何修复它吗?

在下面的代码片段中,我在行映射器中打印了结果集的fetchsize --一次是200,另一次是10,尽管我在两次调用中都使用了相同的JdbcTemplate。

通过jdbctemplate直接执行会在行映射器中返回fetchsize为200

代码语言:javascript
复制
    jdbcTemplate = new JdbcTemplate(ds);
    jdbcTemplate.setResultsMapCaseInsensitive(true);
    jdbcTemplate.setFetchSize(200);

    List temp = jdbcTemplate.query("select 1 from dual", new ParameterizedRowMapper() {
        public Object mapRow(ResultSet resultSet, int i) throws SQLException {
            System.out.println("Direct template : " + resultSet.getFetchSize());
            return new String(resultSet.getString(1));
        }
    });

通过SimpleJdbcCall执行的操作总是在行映射器中返回fetchsize 10

代码语言:javascript
复制
jdbcCall = new SimpleJdbcCall(jdbcTemplate).withSchemaName(schemaName)
                .withCatalogName(catalogName).withProcedureName(functionName);
jdbcCall.returningResultSet((String) outItValues.next(), new        ParameterizedRowMapper<Map<String, Object>>() {
                public Map<String, Object> mapRow(ResultSet rs, int row) throws SQLException {
                   System.out.println("Through simplejdbccall " + rs.getFetchSize());
                    return extractRS(rs, row);
                }
            });
outputList = (List<Map<String, Object>>) jdbcCall.executeObject(List.class, inParam);
EN

回答 3

Stack Overflow用户

发布于 2010-03-09 16:32:39

我不确定ResultSet上的getFetchSize()方法有多可信。JdbcTemplateStatement上调用setFetchSize(),并假定JDBC驱动程序将对其执行正确的操作,包括将其传播到所有ResultSet对象。在这种情况下,Oracle JDBC驱动程序似乎不是。

从这两种方法获得不同行为的原因是,通过JdbcTemplate执行简单的SELECT是简单的JDBC,而从SimpleJdbcCall返回的ResultSet是作为调用的OUT参数获得的。后者更复杂,似乎信息正在丢失。

作为一种变通办法,您是否尝试过自己呼叫ResultSet.setFetchSize()?这可能行不通,但值得一试。您也可以向http://jira.springsource.org/提交一个问题,看看他们是否认为Spring层可以透明地解决这个问题。

票数 4
EN

Stack Overflow用户

发布于 2010-04-02 01:00:20

如果要限制Oracle返回的行数,则应使用子选择查询并指定开始行号和停止行号,如下所示:

代码语言:javascript
复制
SELECT * FROM (SELECT ROWNUM as id, demo.* FROM DEMO_TABLE demo)
WHERE id >= startRowNumber AND id <= stopRowNumber; 

如果你不想要任何特定于Oracle的代码,你应该考虑JPA而不是JDBC:

代码语言:javascript
复制
Query selectQuery = entityManager.createQuery(queryString);
selectQuery.setMaxResults(maxNumberOfElements);
selectQuery.setFirstResult(startRowNumber);
List demoList = entityManager.getResultList(queryString);
票数 2
EN

Stack Overflow用户

发布于 2010-03-10 20:37:42

这不是一个直接的答案,但我认为这是一件很有帮助的事情。当您手动创建spring类的对象时,大多数人往往会忘记调用afterPropertiesSet()方法( Spring调用该方法来执行任何初始化)。

我检查了jdbcTemplate.afterPropertiesSet(),它似乎只设置了异常转换器和数据源。

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

https://stackoverflow.com/questions/2407272

复制
相关文章

相似问题

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