我们正在使用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)
有人可以建议解决方案吗?
答案 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抛出并捕获的较低级别异常引起的。通常它与不正确的地图对象类型有关。