2012-02-23 34 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,而不是回到原來到連接,語句和結果集。