2012-02-23 33 views
2

我们使用Spring 2.6,我们在我们的系统中使用jdbcTemplate以及NamedparameterJdbcTemplate,配置如下。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的”,所以我配置我的豆如下使用的500,其已经被配置为JdbcTemplate的FETCHSIZE:

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

但在此之后,我得到以下例外几个查询:

com.sybase.jdbc3.jdbc.SybSQLException:光标'jconnect_implicit_16'被声明与FOR UPDATE子句。这个光标被发现是只读的。

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

您可以添加其中一个失败查询的示例吗? – 2012-02-23 10:55:51

+0

Hi Tomas,其中一个查询是:SELECT TCRT.assessment_id,TCRT.asset_id,ROUND(TCRT.rcrt_value,0)as rcrt_value,ra_rcrt_codes.rcrt_name,ra_rcrt_codes.rcrt_short_desc,ra_rcrt_codes.rcrt_long_desc FROM ra_assess_rcrt_values TCRT TCRT内部联接ra_rcrt_codes。 rcrt_id = ra_rcrt_codes.rcrt_id和TCRT.active = 1和ra_rcrt_codes。rcrt_name不像'TAM%'和ra_rcrt_codes.active = 1和TCRT.asset_id In(:appId1)。我想这可能是我使用的ROUND函数的问题。由于正常的查询工作正常。 – 2012-02-24 07:23:00

+0

我找到了解决方法,为此添加“为只读”我的查询正在打破。但我不想应用这个机制作为它的大问题来查找查询并改正它们。有人可以提出任何其他解决方法吗? – 2012-03-03 07:19:03

回答

0

通过你所有的映射,并确保他们没事!寻找适当的类型。此问题通常是由SQLStateSQLExceptionTranslator引发并捕获的较低级别异常引起的。通常它与不正确的地图对象类型有关。

+0

嗨ozziefel,我经历了查询,这个问题发生在我已经使用一些像ROUND等聚合函数的查询。它工作正常,当我追加“只读”我的查询。所以我认为默认情况下,游标设置为只读,而我没有在我的查询中指定。那么是否有配置可以通过代码修改我的游标级别,以便我不需要通过我的应用程序查询并更改它们? – 2012-03-06 06:35:55

1

我也得到这个例外。 它与SybasejConnect代表JDBC

我发现this解决方法。

引述Sybase程序员参考jConnectJDBC 6.05

没有已知的好处来设置LANGUAGE_CURSOR为true, 但该选项的情况下,提供的应用程序显示意外 行为时LANGUAGE_CURSOR是假的。

+0

如果可以的话,我会给你一百张票,非常感谢你! – fommil 2013-08-13 12:34:14

2

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

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

产生的原因:java.sql.SQLException中:JZ0R2:没有结果此查询设置。

另一个模糊的问题,在Google上没有什么结果(也没有帮助)。

我现在正在使用中的答案说明了这个问题How to manage a large dataset using Spring MySQL and RowCallbackHandler

这将创建一个具有为ResultSet.CONCUR_READ_ONLY集的语句创建一个StreamingStatementCreator的解决方案,但你仍然可以使用的JdbcTemplate,而不是回到原来到连接,语句和结果集。