NamedParameterJdbcTemplate设置连接获取大小属性

时间:2012-02-23 10:47:39

标签: java

我们正在使用Spring 2.6,我们在系统中使用jdbcTemplate和NamedparameterJdbcTemplate,配置如下。

 <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <constructor-arg ref="dataSource"></constructor-arg>
    <property name="fetchSize" value="500>
  </bean>

<bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
    <constructor-arg ref="dataSource"></constructor-arg>
  </bean>

虽然jdbcTemplate有一个属性“fetchSize”,但namedParameterJdbcTemplate却没有。我想为此设置fetchSize,所以我想出了另一个namedParameterJdbcTemplate的构造函数,它接受“jdbcTemplate”,所以我按如下方式配置我的bean,使用已为jdbcTemplate配置的fetchSize为500:

<bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
    <constructor-arg ref="jdbcTemplate"></constructor-arg>
  </bean>

但在此之后,我接受了几个查询的例外情况:

com.sybase.jdbc3.jdbc.SybSQLException:使用FOR UPDATE子句声明了游标'jconnect_implicit_16'。发现该光标是只读的。

    at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.translate(SQLStateSQLExceptionTranslator.java:121)
    at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.translate(SQLErrorCodeSQLExceptionTranslator.java:322)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:582)
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:616)
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:641)
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:657)
    at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.query(NamedParameterJdbcTemplate.java:123)
    at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.query(NamedParameterJdbcTemplate.java:127)

有人可以建议解决方案吗?

3 个答案:

答案 0 :(得分:2)

不幸的是,上述解决方法具有奇怪的副作用。

使用JdbcTemplate.query(...)执行选择,偶尔会导致0行抛出异常

引起:java.sql.SQLException:JZ0R2:此查询没有结果集。

另一个模糊的问题,谷歌的结果很少(而且没有任何帮助)。

我现在正在使用创建StreamingStatementCreator的解决方案,如对此问题的回答中所述How to manage a large dataset using Spring MySQL and RowCallbackHandler

这将创建一个设置了ResultSet.CONCUR_READ_ONLY的Statement,但您仍然可以使用JdbcTemplate,而不是还原为Connections,Statements和ResultSet。

答案 1 :(得分:1)

我也得到了这个例外。 它与Sybase的{​​{1}} jConnect相关。

我找到了this解决方法。

JDBC

引用Sybase程序员参考jConnect

JDBC 6.05设置为true没有任何已知优势, 但是,如果应用程序显示意外,则提供该选项 LANGUAGE_CURSOR为假时的行为。

答案 2 :(得分:0)

浏览所有映射并确保它们没问题!寻找合适的类型。此问题通常是由SQLStateSQLExceptionTranslator抛出并捕获的较低级别异常引起的。通常它与不正确的地图对象类型有关。