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 及其下的子主题。
我不太明白 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 及其下的子主题。