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>() { public Map mapRow(ResultSet rs, int row) throws SQLException { System.out.println("Through simplejdbccall " + rs.getFetchSize()); return extractRS(rs, row); } }); outputList = (List<Map>) 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层可以透明地解决它。
如果要限制使用Oracle返回的行数,则应使用子选择查询并指定start和stop rownumber,如下所示:
SELECT * FROM (SELECT ROWNUM as id, demo.* FROM DEMO_TABLE demo) WHERE id >= startRowNumber AND id <= stopRowNumber;
如果您不需要任何Oracle特定代码,则应考虑使用JPA而不是JDBC:
Query selectQuery = entityManager.createQuery(queryString); selectQuery.setMaxResults(maxNumberOfElements); selectQuery.setFirstResult(startRowNumber); List demoList = entityManager.getResultList(queryString);
不是直接的答案,但我认为是有用的。 当您手动创建spring类的对象时,大多数人往往忘记调用afterPropertiesSet()方法(Spring调用它来执行任何初始化)。
我检查了jdbcTemplate.afterPropertiesSet()它似乎只设置了exception转换器和数据源。