我正在使用Spring Integration的int-jdbc:inbound-channel-adapter
。Spring集成入站通道中的兩個數據源
我的查詢是如何使用兩個不同的數據源,即數據源A查詢和數據源B更新,在單個適配器?
我正在使用Spring Integration的int-jdbc:inbound-channel-adapter
。Spring集成入站通道中的兩個數據源
我的查詢是如何使用兩個不同的數據源,即數據源A查詢和數據源B更新,在單個適配器?
你不能;兩個操作都使用相同的JdbcTemplate
;您可以省略更新查詢並在出站通道適配器上執行更新。
在Spring JDBC模塊中,我們有類似於AbstractRoutingDataSource
的東西。 你可以根據一些ThreadLocal
變量來實現。
從對方JdbcPollingChannelAdapter
有這樣的代碼:
private Object poll() {
List<?> payload = doPoll(this.sqlQueryParameterSource);
...
executeUpdateQuery(payload);
return payload;
}
所以,你應該以某種方式掛接在doPoll()
和executeUpdateQuery
之間,因此,更改ThreadLocal
的鍵就可以切換到另一個DataSource
在AbstractRoutingDataSource
中。
我只有自定義sqlParameterSourceFactory.createParameterSource()
和ThreadLocal
修改那裏的黑客。只是因爲代碼是這樣的:
private void executeUpdateQuery(Object obj) {
SqlParameterSource updateParamaterSource = this.sqlParameterSourceFactory.createParameterSource(obj);
this.jdbcOperations.update(this.updateSql, updateParamaterSource);
}
(將提交修補updateParamaterSource
錯字:-))。
但是!正如Gary在他的回答中所提到的,最好有幾個JDBC適配器用於不同的DataSource
s:一個用於SELECT
,另一個用於UPDATE
。他們兩人都可以在同一個XA交易中工作(<transactional>
,<poller>
)。從那裏我們真正區分業務邏輯和責任級別。
嗨加里_我明白你的意思,請你幫我理解下面的內容....
1.我必須從數據源A中選擇ID(超過1)。
2.然後我必須通過這些ID來選擇查詢2使用數據源B.
3.最後的點2的輸出,我必須利用數據源更新A – Gaurav
不要試圖把邏輯放在註釋中,它不會嘗試沒有好的表現。改爲編輯問題。你需要使用'jcbc-inbound-adapter-> jdbc-outbound-gateway-> jdbc-oubound-adapter'以及兩者之間的必要變換器。 –