首页 > 解决方案 > DataSource.getConection() 和 Connection.close() 是如何工作的?

问题描述

我真的不明白 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 个非 XA 资源:无法添加更多资源”。

看起来第一次连接的事情还没有结束,我不知道为什么。

我在这里错过了什么?

编辑

有关 DataSource 配置的更多信息

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

通用设置 池设置和交易

标签: javadatasource

解决方案


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


推荐阅读