1

我们正在使用 Weblogic 应用服务器 (12.1.1.0) 开发软件;我们有一个域和两个应用程序。

我们刚刚从开发数据库升级到预生产数据库(类似于生产),哦,天哪,我们遇到了一个重大问题......
DBA 说数据库运行的是相同的版本 - Oracle 11(我不记得确切的版本)。我们可以看到的唯一区别是 dvlp DB 使用 SID 进行连接,而另外两个使用 service-name。

现在,在我们的域中,我们有两个数据源 X 和 Y。两者都连接到同一个数据库。我们在两者上都使用 XA 驱动程序。我们的两个应用程序都使用相同的“persistence.xml”(和实体),它有两个 PU(持久性单元),每个都使用不同的数据源(X 和 Y)。

问题是这样的:

  1. MDB 开始处理请求。
  2. 它使用带有 EntityManagers 的 PU 和带有 DataSource 接口的 Y 数据源,用于获取连接(我们有一些 JDBC 代码)。
  3. 它从其他应用程序调用一个 bean。
  4. 另一个 bean 尝试使用其中一个 PU(连接到 X 数据源的那个)。
  5. 抛出 SQLException:

    XA error: XAResource.XAER_NOTA start() failed on resource 'x_my_domain': XAER_NOTA : The XID is not valid

我们在网上搜索了错误,我们发现我们应该将数据源的配置更改为,
XASetTransactionTimeout=true
XATransactionTimeout=0
但没有奏效。

我们还尝试(很多)调整数据源的配置,最终删除其中一个,因此我们只需要调整其中一个,但没有任何效果。

此外,在反复调整配置时,我们发现了一个不同的 SQLException 并开始弹出,而不是之前的:

Internal error: Cannot obtain XAConnection weblogic.common.resourcepool.ResourceDisabledException: Pool X is Suspended, cannot allocate resources to applications

现在这个更令人沮丧,因为我们尝试了一切;重置数据源;删除并重新创建;删除并使用不同的名称重新创建;删除域并使用不同的数据源名称重新创建;使用 dvlp DB 返回;但没什么,例外似乎仍然存在。

我们真的不知道如何解决这个问题,如果不解决这个问题,我们就无法继续前进。

4

1 回答 1

0

我们终于找到了解决问题的方法,但要回答这个问题,我将不得不更多地解释我们的环境;我们实际上有两台托管服务器,每个应用程序都在另一台服务器上运行。管理服务器和其中一个 MS 在一台机器上运行,另一个 MS 在另一台机器上运行(总共两台机器)。

问题是,当我们修改了另一个 MS 也使用的数据源 (X) 时,我们没有重新启动另一个 MS,而只重新启动了数据源。我们猜测这会导致数据源没有更新其他 MS 上的新修改,这导致了我们遇到的错误。

这个问题是由一个相当愚蠢的原因引起的,但很难发现它,因为它在管理服务器 + 第一个 MS 部分的任何环境设置中重复出现,即使在我们自己的 PC 上设置了一个没有定义的管理服务器的机器。它仍然发生的原因是因为包含其他应用程序的机器的地址是写在代码中的(从 XML 配置中读取,但这并没有太大变化)。

好吧,很高兴这一切都结束了。

于 2012-06-25T08:29:23.463 回答