java - 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();
我认为它应该工作的方式:
- 我初始化了第一个 DataSource
- 我打开与此 DataSource 的连接并立即关闭它。关闭连接应该允许打开其他连接。
- 我初始化第二个数据源
- 我打开到第二个数据源的连接,第一个连接已经关闭,它应该能够毫无问题地打开这个新连接。
但反而 :
当第二个 getConnection() 被调用时,我得到一个“java.lang.IllegalStateException:本地事务已经有 1 个非 XA 资源:无法添加更多资源”。
看起来第一次连接的事情还没有结束,我不知道为什么。
我在这里错过了什么?
编辑
有关 DataSource 配置的更多信息
两个数据源都在 Glassfish 的“JDBC 连接池”中配置,参数相同:
解决方案
WebSphere app Server 正在为您创建一个 LTC(本地事务包含)来控制您的应用程序的事务行为。尽管您的示例中没有显示,但我怀疑您的代码位于 servlet 或 ejb 中,因此这些容器正在为您创建和控制 LTC 的生命周期。当您在 LTC 范围内查找并使用第二个数据源时,它会尝试将其注册到 LTC。在事务中注册/登记多个数据源需要使用支持 XA 的数据源,并且您的数据源似乎没有被定义为支持 XA,因此例外。要开始了解事务和支持 XA 的数据源如何在 WebSphere App Sever 中工作,请参阅此IBM 知识中心主题及其下的子主题。
推荐阅读
- c# - LinkGenerator 返回 NULL Url 而 Url.Action 不返回...为什么
- c# - Sfb 询问密码窗口,当在 Office365 租户上启用 ModernAuthentication 时,如何以编程方式处理它?
- spring - 无法在测试 spring boot jpa 中断言更新的值
- html - Firefox 49.0.1 需要旧版 FireBug
- c - 将 UTC 日期和时间转换为 UNIX 时间会给出错误的(时区不同)值。为什么?
- c# - 将 Active 活动的漂亮 json 输出反序列化为 c# 对象
- python - 在多个文本文件中搜索字符串
- javascript - JavaScript:需要一个标识符,而是看到“myFunction”
- php - 为什么这个带有 HTML(下拉)选择项的 PHP 和 SQL 代码什么都不做?
- maven - 有没有办法自动增加通过詹金斯构建工作的版本?