Java EE 环境中的对象池

Java EE 应用程序服务器提供可由消息驱动的 Bean 应用程序, Enterprise Java Bean 和 Servlet 使用的连接池功能。

WebSphere® Application Server 维护与 JMS 提供程序的连接池,以提高性能。 当应用程序创建 JMS 连接时,应用程序服务器将确定空闲连接池中是否已存在连接。 如果存在,会将连接返回给应用程序;否则,将创建新连接。

图 1 显示激活规范和侦听器端口如何建立 JMS 连接并使用该连接以正常方式监视消息的目标。
图 1。 正常方式
显示激活规范和侦听器端口如何建立 JMS 连接并使用该连接来监视消息的目标的流程图。

使用 IBM® MQ 消息传递提供程序时,执行出站消息传递的应用程序 (例如,企业 Java Bean 和 Servlet) 以及消息驱动的 Bean 侦听器端口组件可以使用这些连接池。

IBM MQ 消息传递提供程序激活规范使用 IBM MQ 资源适配器提供的连接池功能。 有关更多信息,请参阅 配置 WebSphere MQ 资源适配器的属性

使用连接池的示例 说明执行出站消息传递的应用程序和侦听器端口在创建 JMS 连接时如何使用空闲池。

可用连接池维护线程 说明当应用程序或侦听器端口完成连接时,这些连接会发生什么情况。

池维护线程示例 说明如何清除空闲连接池以防止 JMS 连接变为旧连接。

WebSphere Application Server 对可从工厂创建的连接数有限制,由连接工厂的 最大连接数 属性指定。 该属性的缺省值为 10,表示任一时间最多可以使用工厂创建 10 个连接。

每个工厂都有关联的空闲连接池。 当启动应用程序服务器时,空闲连接池为空。 工厂的空闲池中可存在的最大连接数也由“最大连接数”属性指定。

提示: 通过 JMS 2.0,可以使用连接工厂来创建连接和上下文。 因此,连接池可以与包含连接和上下文的混合的连接工厂相关联。 建议连接工厂仅用于创建连接或创建上下文。 这确保该连接工厂的连接池仅包含单一类型的对象,从而使池更高效。

有关连接池在 WebSphere Application Server中的工作方式的信息,请参阅 为 JMS 连接配置连接池。 对于其他应用程序服务器,请参阅相应的应用程序服务器文档。

如何使用连接池

每个 JMS 连接工厂都有一个与其关联的连接池,并且该连接池包含零个或多个 JMS 连接。 每个 JMS 连接都具有关联的 JMS 会话池,并且每个 JMS 会话池都包含零个或多个 JMS 会话。

图 2 显示了这些对象之间的关系。
图 2。 连接池和会话池
显示 JMS 连接与会话之间的关系的流程图
启动侦听器端口,或用于执行出站消息传递的应用程序使用工厂创建连接时,该端口或应用程序会调用以下某个方法:
  • connectionFactory.createConnection()
  • ConnectionFactory.createConnection(String, String)
  • QueueConnectionFactory.createQueueConnection()
  • QueueConnectionFactory.createQueueConnection(String, String)
  • TopicConnectionFactory.createTopicConnection()
  • TopicConnectionFactory.createTopicConnection(String, String)
WebSphere Application Server 连接管理器尝试从此工厂的空闲池获取连接,并将其返回到应用程序。

如果池中没有空闲连接,并且使用该工厂创建的连接数尚未达到该工厂的最大连接数属性所指定的限制,那么连接管理器会创建新连接以供应用程序使用。

但是,如果应用程序尝试创建连接,但使用该工厂创建的连接数已达到该工厂的最大连接数属性值,那么应用程序将等待连接变为可用(即被放回到空闲池中)。

应用程序等待的时间在连接池的连接超时属性中指定,其缺省值为 180 秒。 如果在 180 秒内将连接放回到空闲池中,那么连接管理器会立即再次将该连接从池中取出并传递给应用程序。 但是,如果超过了超时时间段,那么会抛出 ConnectionWaitTimeoutException

当应用程序使用完连接并通过调用以下方法来将其关闭时:
  • Connection.close()
  • QueueConnection.close()
  • TopicConnection.close()
该连接实际上仍保持打开状态,并返回到空闲池中,以便可供其他应用程序复用。 因此,您可以在 WebSphere Application ServerJMS 提供程序之间打开连接,即使没有 JMS 应用程序在应用程序服务器上运行也是如此。