【问题标题】:How does the DataSource.getConection() and Connection.close() works?DataSource.getConection() 和 Connection.close() 是如何工作的?
【发布时间】:2021-05-15 01:46:03
【问题描述】:

我不太了解 Java 中的 DataSource/Connection 是如何工作的。

这是我使用的类:

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 Connection Pools”中配置,参数相同:

【问题讨论】:

  • 将数据源的配置以及异常的完整堆栈跟踪添加到您的问题中会很有用。

标签: java datasource


【解决方案1】:

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

【讨论】:

  • 我的代码确实在 EJB 中。感谢您的解释,我并不完全了解 LTC 的工作方式。支持 XA 的数据源是我已经遇到过的解决方案,我想我会使用这些解决方案。
猜你喜欢
  • 1970-01-01
  • 2018-11-10
  • 2018-02-12
  • 2018-06-21
  • 2012-09-13
  • 2014-03-29
  • 2013-09-06
  • 2015-11-26
  • 2011-01-03
相关资源
最近更新 更多