gpt4 book ai didi

java - SimpleJdbcCall 忽略 JdbcTemplate 获取大小

转载 作者:搜寻专家 更新时间:2023-10-30 19:40:54 29 4
gpt4 key购买 nike

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

在下面的代码片段中打印了 rowmapper 中结果集的 fetchsize - 一旦它是 200,其他时候它是 10,即使我在这两种情况下都使用相同的 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 的执行总是在行映射器中返回 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,而 ResultSet 你从 SimpleJdbcCall 返回是作为调用的 OUT 参数获得的。后者更复杂,似乎信息正在丢失。

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

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

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com