我们正在通过Spring SimpleJdbcCall调用pl / sql存储过程,而SimpleJdbcCall将忽略JdbcTemplate上设置的fetchsize。即使我们已将jdbctemplate fetchsize设置为200,rowmapper结果集的提取大小仍设置为10。为什么会发生这种情况以及如何解决呢?

在下面的代码片段中,在rowmapper中打印了结果集的fetchsize-一次是200,另一次是10,即使我在两种情况下都使用相同的JdbcTemplate。

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

    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中返回fetchsize 10
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);

最佳答案

我不确定getFetchSize()上的ResultSet方法可以信任多少。 JdbcTemplatesetFetchSize()上调用Statement,并假定JDBC驱动程序将对其进行正确的处理,包括将其传播到所有ResultSet对象。在这种情况下,似乎不是Oracle JDBC驱动程序。

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

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

关于java - SimpleJdbcCall忽略JdbcTemplate的获取大小,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2407272/

10-10 18:02