让我首先描述一下当前的架构:
应用程序A是一个运行在JBOSS中的java应用程序,并且有自己的数据库(mssql)。
应用程序 B 是一个在 Windows 计算机上运行的 COM+ 应用程序,它也由自己的数据库 (mssql) 支持。
对于某些业务需求,应用程序 A 必须调用应用程序 B。为此,在与应用程序 A 相同的计算机(即 JBOSS 计算机)上安装了 COM 代理。 JNI 接口(interface)允许我们从应用程序 A-->B 进行调用。
这就是我们今天所拥有的,并且效果非常好。现在,出现了一个新的业务需求,需要实现如下的两阶段提交功能:
将创建一个新的应用程序 C(可能是 .net 应用程序),该应用程序将由其自己的数据库支持。应用程序 C 将驻留在第三台服务器上(不在我们的站点中)。
应用程序 C 在事务中调用应用程序 A。应用程序 A 应在考虑嵌入式业务逻辑后执行一些操作。操作包括对应用程序 A 数据库的写入和对应用程序 B 的调用。应用程序 B 执行其他操作(对应用程序 B 数据库)。应用程序 C 根据收到的反馈更新其数据库。现在,如果所有操作都成功,则更改将提交到数据库,否则操作将回滚。
问题很简单(我认为答案更复杂)。考虑到支持每个应用程序的不同技术,这是否可行?我完全理解,如果所有应用程序都用 .Net 或 COM+ 应用程序编写,这是可行的。目前,用另一种技术替换 java 组件并不是一个可行的选择。有什么想法吗?
我们检查了 JNBridge,但我认为它不能提供我们想要的东西。如果应用程序 C 没有问题就好了。
欢迎任何想法/解决方案。您认为最好的选择是什么?
最佳答案
您的平台可以支持 WS-AtomicTransaction Web 服务接口(interface)吗?某些供应商的产品可以实现 Java/.NET 与该标准的互操作。这可以提供真正的 2PC。
但是,无论您如何使用 2PC,都会产生性能和复杂性成本。仔细查看此架构的耦合含义:尤其是在 2PC 解决阶段发生故障时的问题解决。在不确定事务解决之前,无法安全地删除锁 - 在某些故障情况下,这可能会花费相当长的时间。
很多时候,您可以重新设计一个问题,这样您实际上就不再需要 2PC——有大量的业务不需要 2PC 就可以完成。
关于java - 不同技术之间的两阶段提交(COM+、Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4381872/