在连接池中使用 CONNECTIONNAMELIST 或 CCDT

某些 Java EE 环境 (例如, WebSphere® Application Server) 提供 JMS 连接池。 可用于运行 Java SE 应用程序的容器。

使用 Java EE 环境中定义的连接工厂创建连接的应用程序可以从该连接工厂的连接池中获取现有空闲连接,也可以在连接池中没有合适的连接时获取新连接。

这可能暗示已配置的连接工厂是定义 CONNECTIONNAMELIST 属性还是 CCDTURL 属性。

首次使用连接工厂来创建连接时, Java EE 环境将使用 CONNECTIONNAMELIST。 或 CCDTURL 以创建与 IBM® MQ 系统的新连接。 当不再需要该连接时,会将其返回到连接池中,该连接在连接池中可供复用。

如果其他内容从连接工厂创建连接,那么 Java EE 环境将返回来自连接池的连接,而不是使用 CONNECTIONNAMELISTCCDTURL 属性来创建新连接。

如果队列管理器实例在发生故障时正在使用某个连接,那么将废弃该连接。 但是,可能不会废弃连接池中的内容,这意味着连接池中可能仍包含与不再运行的队列管理器的连接。

在这种情况下,下次请求使用连接工厂来创建连接时,将返回与发生故障的队列管理器的连接。 任何使用此连接的尝试均会失败,因为该队列管理器不再运行,因而导致废弃了此连接。

仅当连接池为空时, Java EE 环境才会使用 CONNECTIONNAMELISTCCDTURL 属性来创建与 IBM MQ的新连接。

由于 CONNECTIONNAMELIST 和 CCDT 用于创建 JMS 连接的方式,因此还可以具有包含与不同 IBM MQ 系统的连接的连接池。

例如,假设在将 CONNECTIONNAMELIST 属性设置为以下值的情况下配置了连接工厂:
CONNECTIONNAMELIST = hostname1(port1), hostname2(port2)

假设应用程序首次尝试使用该连接工厂创建与独立队列管理器的连接,那么无法访问系统 hostname1(port1) 上运行的队列管理器。 这意味着应用程序最终会连接到 hostname2(port2) 上运行的队列管理器。

另一个应用程序现在会出现,并从同一连接工厂创建 JMS 连接。 hostname1(port1) 上的队列管理器现在可用,因此将创建与此 IBM MQ 系统的新 JMS 连接并将其返回到应用程序。

当两个应用程序都已完成时,它们将关闭其 JMS 连接,这将导致连接返回到连接池。

结果是连接工厂的连接池现在包含两个 JMS 连接:
  • 一个是与 hostname1(port1) 上运行的队列管理器的连接
  • 一个是与 hostname2(port2) 上运行的队列管理器的连接

这可能导致与事务恢复有关的问题。 如果 Java EE 系统需要回滚事务,那么它需要能够连接到有权访问事务日志的队列管理器。