DataSource.getConection() 和 Connection.close() 是如何工作的?

How does the DataSource.getConection() and Connection.close() works?

我不太明白 DataSource/Connection 在 Java 中是如何工作的。

这是我使用的 类 :

import javax.naming.InitialContext;
import javax.sql.DataSource;
import java.sql.Connection;

这是一个代码示例。这不是我的真实代码,而是一个解释我的问题的简单示例:

InitialContext context = new InitialContext();
DataSource dataSource1 = (DataSource) context.lookup(JNDI_ORACLE_1);
dataSource1.getConnection().close();
DataSource dataSource2 = (DataSource) context.lookup(JNDI_ORACLE_2);
dataSource2.getConnection();

我认为它应该工作的方式:

而是:

当调用第二个 getConnection() 时,我得到一个“java.lang.IllegalStateException:本地事务已经有 1 个 non-XA 资源:无法添加更多资源。”

第一次连接好像还没有结束,不知道为什么。

我在这里错过了什么?

编辑

有关数据源配置的更多信息

两个数据源都在 Glassfish 的“JDBC 连接池”中配置,参数相同:

WebSphere app Server 正在为您创建一个 LTC(本地事务控制)来控制您的应用程序的事务行为。尽管您的示例中没有显示,但我怀疑您的代码在 servlet 或 ejb 中,因此这些容器正在为您创建和控制 LTC 的生命周期。当您查找并使用 LTC 范围内的第二个数据源时,它会尝试将其注册到 LTC。 Enrolling/enlisting 事务中的多个数据源需要使用支持 XA 的数据源,而且您的数据源似乎未定义为支持 XA,因此是例外。要开始了解事务和支持 XA 的数据源如何在 WebSphere App Sever 中工作,请参阅此 IBM Knowledge Center topic 及其下的子主题。