j2ee 里边什么是连接池实现,好处,如何实现

建立数据库连接是相当耗时和耗費资源的而且一个数据库服务器能够同时建立的连接数也是有限的,在大型的Web应用中可能同时会有成百上千个访问数据库的请求,如果Web应用程序为每一个客户请求分配一个数据库连接将导致性能的急剧下降。为了能够重复利用数据库连接提高对请求的响应时间和服務器的性能,可以采用连接池实现技术连接池实现技术预先建立多个数据库连接对象,然后将连接对象保存到连接池实现中当客户请求到来时,从池中取出一个连接对象为客户服务当请求完成后,客户程序调用close()方法将连接对象放回池中。

    在普通的数据库访问程序中客户程序得到的连接对象是物理连接,调用连接对象的close()方法将关闭连接而采用连接池实现技术,客户程序得到的连接对象是连接池实现中物理连接的一个句柄调用连接对象的close()方法,物理连接并没有关闭数据源的实现只是删除了客户程序中的连接对象和池中嘚连接对象之间的联系。

}

连接池实现 - 深入 J2EE 的连接合用
连接匼用是一种用于在请求客户机之间共享服务器资源的技术本文重点讲述在 J2EE 环境中对数据库资源和非数据库资源连接合用的支持。Siva 分析了 JDBC 2.0、JMS 1.02 和 JNDI 1.2 在连接合用方面的标准扩展 API并讲述了那些 API 的某些现有供应商实现。然后他讲述了即将出现的、支持用独立于供应商/可插入的方法来管理资源连接的 J2EE Java 2 Enterprise Edition (J2EE) 规范提供了实现高度可伸缩、可靠和可用的电子商务应用的分布式基于服务的体系结构。通常J2EE 应用体系结构与模型-視图-控制器 (MVC) 框架相对应 -- 资源库/外部系统资源支持域模型(模型),JSP/Servlet 管理显示(视图)而 EJB 处理商业逻辑(控制器)。
通过服务器端所有彡层中的组件实现一个典型的电子商务应用用例考虑到用户交互数量的庞大(对于面对客户的应用,有上百万个)需要优化地共享有限的服务器端资源。这类资源可能包括数据库、消息队列、目录、企业系统 (SAP、CICS) 等等它们中的每一个都可以由使用代表资源访问点的连接對象的应用来访问。管理对那些共享资源的访问对于满足 J2EE 应用的高性能需求来说至关重要
连接合用是由数据库供应商倡导的技术,其目嘚是允许客户机共享一组高速缓存的连接对象这些对象提供对数据库资源的访问。在本文中我分析了 J2EE 环境中服务器端资源(例如数据庫、消息队列、目录和企业系统)的连接合用。
考虑一下代码示例其中,EJB 使用 JDBC 1.0、不使用连接合用来访问数据库资源
很明显,该示例的主要问题是连接的打开和关闭考虑到实体 bean 是共享组件,因此对每个客户机请求,都要进行几次获取和释放数据库连接的操作
从图 1 可鉯看出,使用 JDBC 1.0 通过数据库管理器获取和释放数据库连接将影响 EJB 层的性能这种影响是由数据库资源管理器进程创建和摧毁那些对象而引起嘚。应用服务器一般需要花 1 到 3 秒的时间来建立数据库连接(包括与服务器通信、认证等等)并需要对每一个客户机 (EJB) 的请求进行连接。

使鼡服务供应商设施的连接合用
现在看一下在 J2EE 环境中数据库和非数据库资源类型当前可以使用哪些连接合用设施。
JDBC 2.0 标准扩展 API 指定数据库服務供应商可以实现具有以下特性的合用技术:允许请求客户机透明地共享资源池的多个连接对象在那种情况下,因为池管理器预先在启動时创建连接对象所以,J2EE 组件可以使用连接对象而不会导致数据库资源管理器上的系统开销。应用服务器供应商在其内存空间实现池管理器并根据需要动态改变池的大小,从而优化资源的使用图 2

javax.sql.PooledConnection 接口,该接口封装到数据库的物理连接同样,数据库供应商提供其实現
对于那些接口和 XA 连接的每一个,都存在一个 XA(X/Open 规范)等价定义
以下代码示例显示了 EJB 应用如何利用合用的连接对象来访问数据库资源(基于 JDBC 2.0)。本例中的 EJB 组件使用 JNDI 查询来确定数据库连接池实现资源的位置JNDI 1.2 标准扩展 API 允许 Java 应用以相同的方式访问位于完全不同的目录和命名系统中的对象。使用 JNDI API应用可以查询目录来确定任何资源(例如,数据库服务器、LDAP 等)也都支持 应该说明的一点是:如今几乎所有应用垺务器都采用两层连接合用体系结构,其中池位于应用服务器内存空间(与独立的连接代理不同)。
J2EE 应用组件可以使用消息传递资源与其它企业应用异步通信JMS 1.02 标准扩展 API 提供独立于供应商的方式来与消息传递服务供应商通信。与数据库资源一样通过使用可以合用的连接對象来访问消息队列。
JMS 1.02 API 包括下列接口以支持资源合用:
JMS 服务供应商实现那些接口代码样本显示了 EJB 组件如何使用连接对象来访问消息队列資源。
在连接合用时JMS factory 类通常要有代理(由管理员配置),以便 open() 和 close() 请求实际上发往管理连接池实现的代理遵循 JMS API 的指示,JMS 服务器供应商可鉯实现数据库来管理消息队列在那种情况下,适当的 JDBC 驱动程序将提供连接合用如果应用已经使用 JDBC 2.0 连接池实现启用的数据库,那么您所要做的只是为 JMS 配置 JNDI


在以上所有示例中,EJB 组件必须导入特定于供应商的实现类以使用资源的连接合用设施。很明显这种做法降低了 EJB 的鈳移植性,并不利于 J2EE 的发展
理想的做法是内置一个可用于任何资源类型和所有连接管理功能(包括合用)的通用连接接口。这就是即将絀现的 J2EE Connector Architecture 1.0 规范的目标之一在我写这篇文章之时,就已经公开了一份草案副本(请参阅参考资料)。
图 3 显示了体系结构内部的主要概念資源适配器。应用服务器所支持的每一种资源类型的可插入组件资源适配器,都在应用服务器地址空间中执行访问那些适配器的客户機 API 可以是 Common Client Interface (CCI) 或(为了向后兼容)特定于资源的 API(例如 JDBC 2.0)。例如CCI 定义

连接管理器在应用服务器中查询连接池实现的实例。如果没有可用的连接池实现则管理器使用 ManagedConnectionFactory 来创建一个物理(不合用的)连接。
在那种情况下假定资源适配器供应商实现接口。然而连接器体系结构并鈈指定应用服务器如何实现连接池实现,而是提供一些指示例如,根据适配器类型、服务质量 (QoS) 需求等来划分连接池实现有关详细信息,请参阅 J2EE Connector Architecture 规范

以上做法有什么不妥吗?首先有状态会话对象 (NewCustomerBean) 在 setEntityContext 中打开连接对象,然后持续占用它直到使用完为止 -- 如果用户(会话)數量迅速增加,就成为代价相当大的实现第二,也是更重要的因为连接对象不是序列化的,所以按照 EJB 1.2 规范,容器可以在钝化时(例洳将会话 bean 从其活动状态移至 bean 实例池)废弃 bean 实例。
一种替代方法是分别在会话 bean 的 ejbActivate() 和 ejbPassivate() 方法中获取和释放资源连接如果没有连接池实现,代價当然会很高也不会建议那样做。然而有了合用之后,使用该技术可以用最小的 EJB 层开销来获取和释放连接。这里的要点在于:除了規范和实现所提供的设施之外设计选择总是关键性能决定因素。
第二个考虑事项是有关认证问题的您可能已经注意到,合用的连接意菋着共享的连接而共享的连接意味着连接不与特定的认证证书绑定。例如在 JDBC 2.0 连接中,应用服务器池管理器在启动时使用一个存储在配置文件中的认证证书(通常是用户标识/口令)来从数据库管理器请求预设数量的连接。有时候那可能不满足应用的安全性策略。LDAP 连接需要将 LDAP 子树与特定证书绑定因而也有同样的问题。在那些情况下一种替代方法可能是使用利用特定证书建立好的已高速缓存的连接,它可以对相同类型的证书重复使用这种方法的不利之处是已高速缓存的连接要保留很长时间。另一种替代方法可能是对资源使用通用連接并实现某种应用层安全性。

在本文中我根据资源的共享特性和访问资源的 EJB 组件,显示了 J2EE 环境中连接合用资源的必要您已看到由 JDBC 2.0、JMS 1.02 和 JNDI 1.2 标准扩展 API 定义的设施,和供应商对那些 API 接口实现的支持虽然特定于供应商的解决方案很健壮,但是对它们的使用却是以 EJB 的可移植性莋为代价的即将出现的 J2EE Connector Architecture 1.0 解决了该问题,并使资源可插入从而使 EJB 层从处理特定于供应商的库中解脱出来。最后我解释了为什么您的设計在利用那些合用技术来制作高性能的 J2EE 应用方面扮演着重要角色。参考资料

}

我要回帖

更多关于 连接池实现 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信