我正在使用Spring Integration的int-jdbc:inbound-channel-adapter
。
My Query是如何在一个适配器中使用两个不同的数据源,即数据源A进行查询,数据源B进行更新?
答案 0 :(得分:2)
你不能;两个操作都使用相同的JdbcTemplate
;您可以省略更新查询并在出站通道适配器上执行更新。
答案 1 :(得分:0)
在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在他的回答中提到的,最好为不同的DataSource
设置几个JDBC适配器:一个用于SELECT
,另一个用于UPDATE
。它们都可以在同一个XA事务中工作(<transactional>
上的<poller>
)。从那里我们真正区分了业务逻辑和责任级别。