【问题标题】:NamedParameterJdbcTemplate setting connection fetch size propertyNamedParameterJdbcTemplate 设置连接获取大小属性
【发布时间】:2012-02-23 10:47:38
【问题描述】:

我们使用的是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,所以我想出了另一个接受“jdbcTemplate”的namedParameterJdbcTemplate的构造函数,所以我将我的bean配置为使用已经为jdbcTemplate配置的500的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)

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

【问题讨论】:

  • 您能否添加一个失败查询的示例?
  • 嗨 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 内部连接 ​​ra_rcrt_codes 在 TCRT.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 函数的问题。因为普通查询工作正常。
  • 我找到了一种解决方法,方法是在我的中断查询中添加“只读”。但我不想应用这种机制作为查找查询并纠正它们的大要求。有人可以建议任何其他解决方法吗?

标签: java


【解决方案1】:

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

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

原因:java.sql.SQLException: JZ0R2: No result set for this query.

另一个在 Google 上几乎没有结果(而且没有帮助)的晦涩问题。

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

这会创建一个设置了 ResultSet.CONCUR_READ_ONLY 的 Statement,但您仍然可以使用 JdbcTemplate,而不是恢复为 Connections、Statements 和 ResultSets。

【讨论】:

    【解决方案2】:

    我也遇到了这个异常。 它与Sybase jConnect for JDBC 有关。

    我找到了this 解决方法。

    引用Sybase程序员参考jConnectJDBC 6.05

    LANGUAGE_CURSOR 设置为 true 没有已知的优势, 但是提供了该选项以防应用程序显示意外 LANGUAGE_CURSOR 为 false 时的行为。

    【讨论】:

    • 如果可以的话,我会给你一百票,非常感谢!
    • 链接无效。你能在这里提供一些关于它的细节吗?
    【解决方案3】:

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

    【讨论】:

    • 嗨 ozziefel,我完成了查询,并且在我使用了一些聚合函数(如 ROUND 等)的查询中出现了这个问题。当我将“只读”附加到我的查询时,它工作正常。所以我认为默认情况下光标设置为只读,而我没有在我的查询中指定。那么是否有任何配置可以通过代码修改我的光标级别,这样我就不需要通过我的应用程序查询并更改它们?
    猜你喜欢
    • 2018-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-16
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多