我们的测试设置的高级描述如下:
- Java应用程序正在Jboss(WildFly)上运行
- 使用Oracle作为数据库服务器
- IBM MQ和Oracle数据源之间的XA事务
- 超过100个并发事务执行MQ GET/PUT和SQL插入/读取/更新/删除
- 每秒要处理1000多个事务
- 每个事务执行大约100次SQL插入+一些读取(一些事务还执行一些删除和更新)
- 2个Jboss节点,配备32个CPU和32个CPU的Oracle数据库服务器
每个事务将连接到大约3个数据源。然而,所有数据源都在同一个数据库示例上。我一直想知道,当有一个XA事务时,在同一个数据库示例上有多个数据源是否会有开销。我问的一个原因是,我们现在正在努力解决“enq:DX -争用”在Oracle中等待。
我一直在谷歌搜索,但没有找到明确的答案。Oracle似乎对此场景进行了某种优化https://docs.oracle.com/en/database/oracle/oracle-database/19/jjdbc/distributed-transactions.html#GUID-2C258328-7DFD-42ED-AA03-01959FFE924A(32.3.4 Oracle XA优化)然而,如上所述,我们正在努力解决“enq:DX -争用”等待
任何见解都会有所帮助
1条答案
按热度按时间lsmepo6l1#
如果您对同一个数据库使用多个数据源,我发现您的解决方案中存在一些问题。
如果你有3个数据源,你就有3个独立的数据库连接,所以你也有3个并行的数据库事务。
首先,你的应用程序会有开销,因为你必须在应用程序层面同步事务。最重要的是,这3个事务是通过XA同步的。这可能会导致巨大的性能问题。
如果您有3个事务,则需要3次提交,这可能比一次提交要慢。
这3个DB事务可能会遇到死锁,因为所有3个事务都试图修改相同或相关的数据。