【发布时间】:2014-03-06 13:16:25
【问题描述】:
Spring Integration 中<jdbc:inbound-channel-adapter> 组件的属性包括data-source、sql 和update。这些允许针对指定数据库中的表运行单独的 SELECT 和 UPDATE 语句。两条 sql 语句将属于同一事务。
这里的限制是 SELECT 和 UPDATE 都将针对同一个数据源执行。当 UPDATE 位于不同数据源(而不仅仅是同一服务器上的不同数据库)的表上时,是否有解决方法?
我们的具体要求是选择表中具有特定时间之前时间戳的行。该时间存储在单独数据源的表中。 (它也可以存储在文件中)。如果两个 sql 语句都使用同一个数据库,那么 <jdbc:inbound-channel-adapter> 对我们来说开箱即用就可以了。在这种情况下,SELECT 可以使用存储在表 A 中的时间作为针对表 B 运行的查询中 WHERE 子句的一部分。然后将表 A 中的时间更新为当前时间,所有这些都将是一笔交易的一部分。
我的一个想法是,在适配器的sql 和update 属性中,使用SpEL 调用bean 中的方法。为sql 定义的方法将查找存储在文件中的时间,然后返回完整的SELECT 语句。为update 定义的方法将更新同一文件中的时间并返回一个空字符串。但是,我不认为这种方法是故障安全的,因为文件的读取和写入不会是数据源正在使用的同一事务的一部分。
但是,如果保证update 仅在提交数据源事务时触发,那么这对我们有用。如果发生故障,数据库事务将提交,但文件不会被更新。然后我们会得到重复的行,但应该能够处理它。问题是文件是否已更新并且数据库事务失败。那将意味着丢失的消息,我们无法处理。
如果有人对如何处理这种情况有任何见解,我们将不胜感激。
【问题讨论】: