14

我们有一个现有的 C++ 应用程序,我们将逐渐用一个新的基于 Java 的系统来替换它。在我们完全用 Java 重新实现所有东西之前,我们希望 C++ 和 Java 必须相互通信(RMI、SOAP、消息传递等——我们还没有决定)。

现在我的经理认为我们需要 Java 和 C++ 方参与同一个 Oracle DB 事务。这与通常的分布式事务问题有关,但不同于通常的分布式事务问题,即单个进程协调 2 个事务资源,例如数据库和消息队列。

从性能和稳定性的角度来看,我认为跨进程传播事务是一个糟糕的想法,但我仍然会被要求提供解决方案。

我熟悉 XA 事务并且我已经使用 JBoss 事务管理器完成了一些工作,但是我的谷歌搜索在 2 个进程之间传播 XA 事务并没有发现任何好的结果。

我们在 Java 端使用 Spring,他们的文档明确声明他们不提供任何事务传播帮助。

我们不打算使用传统的 Java EE 服务器(例如:IBM Websphere),它可能支持传播(不是我能找到任何权威文档)。

非常感谢任何有关解决方案的帮助或指示。

4

3 回答 3

10

Laurent Schneider 的博客上有一个使用 Oracle 内部的 DBMS_XA 包来允许多个会话在同一个事务中工作的示例。因此,可以让 Java 和 C++ 会话参与同一个事务,而无需任何类型的额外协调器。

或者,您可以考虑使用 Workspace Manager。最初的设计目的是支持超长时间运行的事务(即为提议的开发处理大量空间数据)。本质上,您可以创建一个工作区,在您的情况下,它大致相当于一个命名事务。Java 和 C++ 代码都可以进入该工作区(从单独的会话中),并且都可以在该工作区中操作和提交数据。事务完成后,您可以将工作区合并到 LIVE 工作区,这相当于在正常事务中进行提交。

另一方面,我强烈同意您的初步评估,即从性能、稳定性、简单性和维护的角度来看,协调进程之间的事务很可能是一个坏主意。另一方面,这很可能是一个合法的业务需求,这取决于 C++ 代码将如何退役(即是否可以以事务可以完全是 Java 或完全是 C++ 的方式替换代码)

于 2008-09-17T20:46:53.837 回答
4

我一直在使用Hazlecast消息传递和分布式内存锁来解决其中一些问题,但是使用这样的工具需要您在接触相同数据的那些部分重新设计您的软件。C++ 客户端文档在这里Java 客户端在这里

Oracle 也有一个类似的产品,称为 Oracle Coherence,它可能会对您有所帮助,请参阅开发指南中的锁定

此外,该数据库包含一个称为 Oracle Streams 高级队列(事务持久队列)的 MQ 系统,在某些情况下可能会对您有所帮助。Oracle AQ 与 Oracle 触发器很好地集成在一起。

此外,数据库更改通知可以帮助您更新缓存或通知更新进程,这可以与Optimistic Offline Lock 模式一起使用。

另请参阅软件事务内存

Apache Zookeeper 还可以帮助您进行分布式锁定

于 2015-04-07T08:46:29.960 回答
0

我相信 JBoss Transaction Manager 支持跨 Web 服务调用的 2pc tx 传播。你可以,我想以这种方式集成你的系统,但性能会很糟糕。

于 2008-09-23T18:08:58.993 回答