2013-06-19 51 views
0

我的應用程序中有一個非常奇怪的錯誤。我面臨的問題是,如果我在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

回答

0

我使用的DataSource背後存在的問題:首先我使用了使用共享的commons.dbcp.BasicDataSource。當我將其更改爲spring.jdbc.SimpleDriverDataSource時,它開始工作。這一個總是要求新的連接到數據庫,而以前使用連接池。 但是BasicDataSource仍然使用maven,但沒有在SMX中 - >我沒有檢查BasicDataSource的源碼,但是我的本地Maven依賴和SMX中依賴的唯一區別是:在我的Maven I中沒有導入commons-pool,而這個軟件包安裝在SMX中。我假設有一個內部機制,以防目錄中沒有公共池...