Oracle 事务在 C++ 和 Java 之间的传播

2022-09-04 03:17:21

我们有一个现有的C++应用程序,我们将逐步用一个新的基于Java的系统来取代它。在我们完全重新实现Java中的所有内容之前,我们希望C++和Java必须相互通信(RMI,SOAP,消息传递等 - 我们还没有决定)。

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

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

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

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

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

任何帮助或关于解决方案的指导都非常感谢。


答案 1

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

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

另一方面,我非常同意您的初步评估,即从性能、稳定性、简单性和维护的角度来看,协调流程之间的事务很可能是一个坏主意。另一方面,它很可能是一个合法的业务需求,这取决于C++代码将如何被淘汰(即,是否有可能以这样一种方式替换代码,即事务可以是Java的,也可以是排他性的C++)


答案 2

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

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

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

此外,还有数据库更改通知,可以帮助您更新缓存或通知更新进程,这可以与乐观脱机锁定模式一起使用。

另请参见软件事务性内存

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


推荐