Spring集成入站通道中的两个数据源

时间:2016-04-20 21:51:36

标签: spring spring-integration

我正在使用Spring Integration的int-jdbc:inbound-channel-adapter

My Query是如何在一个适配器中使用两个不同的数据源,即数据源A进行查询,数据源B进行更新?

2 个答案:

答案 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>)。从那里我们真正区分了业务逻辑和责任级别。