+-
java – SimpleJdbcCall忽略JdbcTemplate获取大小
我们通过 Spring SimpleJdbcCall调用pl / sql存储过程,SimpleJdbcCall忽略了JdbcTemplate上的fetchsize设置.尽管我们已将jdbctemplate fetchsize设置为200,但rowmapper结果集获取大小设置为10.任何想法为什么会发生这种情况以及如何解决它?

在下面的代码片段中的rowmapper中打印了结果集的fetchsize – 一旦它是200而其他时间它是10,即使我在两个occassion上都使用相同的JdbcTemplate.

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

    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执行此操作始终在rowmapper中返回10的fetchsize

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);
最佳答案
我不确定ResultSet上的getFetchSize()方法可以信任多少. JdbcTemplate在Statement上调用setFetchSize(),并假定JDBC驱动程序将使用它执行正确的操作,包括将其传播到所有ResultSet对象.在这种情况下,似乎没有Oracle JDBC驱动程序.

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

作为一种解决方法,您是否尝试过自己调用ResultSet.setFetchSize()?它可能不起作用,但它值得一试.您还可以向http://jira.springsource.org/提交一个问题,看看他们是否认为Spring的JDBC层可以透明地解决它.

点击查看更多相关文章

转载注明原文:java – SimpleJdbcCall忽略JdbcTemplate获取大小 - 乐贴网