我的應用程序中有一個非常奇怪的錯誤。我面臨的問題是,如果我在ServiceMix中運行我的應用程序,則來自SimpleJdbcCall的結果集始終包含以前存儲過程調用的所有先前值。ServiceMix中的Spring JdbcTemplate/SimpleJdbcCall有狀態
但是,在本地運行時只存儲最後一個值。
我的駱駝航線(使用虛假姓名):
<from ref="cronQuartzEndpoint"/>
<to uri="bean:userDAO?method=listAll"/>
<split>
<simple>${body}</simple>
<to uri="bean:myStoredProcCaller?method=requestAndStoreUserName" />
<to uri="bean:userDAO?method=saveUser" />
</split>
讓我們來看看存儲過程調用者的邏輯。假設存儲過程返回用戶名稱,並等待id作爲參數。
public User requestAndStoreUserName(User user) {
LOG.info("userId: " + user.getId());
//I know it's not necessary but I added it to ensure that new RowMapper is generated
mySimpleJdbcCall.returningResultSet(USER_NAME_FIELD, new UserNameRowMapper());
mySimpleJdbcCall.compile();
Map<String, Object> results = mySimpleJdbcCall.execute(user.getId());
List<String> userNames = (List<String>)results.get(USER_NAME_FIELD);
LOG.info("userNames: " + userNames);
if (!userNames .isEmpty()) {
user.setName(userNames.get(0));
}
return user;
}
而我的RowMapper很簡單,因爲這:
private static class UserNameRowMapper implements RowMapper<String> {
@Override
public String mapRow(ResultSet rs, int rowNum) throws SQLException {
return rs.getString(USER_NAME_RESPONSE_FIELD_INDEX);
}
};
日誌,如果我在本地運行我的駱駝航線:
- 用戶名:1
- 用戶名:[愛麗絲]
- userId:2
- userNames: [鮑勃]如果
日誌運行它在ServiceMix的:
- 用戶名:1
- 用戶名:[甲]
- 用戶名:2個
- 用戶名:[甲,乙]
工件的使用版本和所有配置在兩側都是相同的。任何想法這個問題背後的邏輯是什麼?謝謝,Gergely