国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設(shè)計 > 正文

連接池深入J2EE的連接合用

2019-11-18 16:13:34
字體:
供稿:網(wǎng)友

內(nèi)容:


為何合用資源連接?
連接合用
J2EE Connector Architecture 1.0
設(shè)計考慮事項
結(jié)束語
參考資料
關(guān)于作者




連接合用是一種用于在請求客戶機之間共享服務(wù)器資源的技術(shù)。本文重點講述在 J2EE 環(huán)境中對數(shù)據(jù)庫資源和非數(shù)據(jù)庫資源連接合用的支持。Siva 分析了 JDBC 2.0、JMS 1.02 和 JNDI 1.2 在連接合用方面的標準擴展 API,并講述了那些 API 的某些現(xiàn)有供應(yīng)商實現(xiàn)。然后,他講述了即將出現(xiàn)的、支持用獨立于供應(yīng)商/可插入的方法來管理資源連接的 J2EE Connector Architecture 1.0。



java 2 EnterPRise Edition (J2EE) 規(guī)范提供了實現(xiàn)高度可伸縮、可靠和可用的電子商務(wù)應(yīng)用的分布式基于服務(wù)的體系結(jié)構(gòu)。通常,J2EE 應(yīng)用體系結(jié)構(gòu)與模型-視圖-控制器 (MVC) 框架相對應(yīng) -- 資源庫/外部系統(tǒng)資源支持域模型(模型),jsp/Servlet 管理顯示(視圖),而 EJB 處理商業(yè)邏輯(控制器)。

通過服務(wù)器端所有三層中的組件實現(xiàn)一個典型的電子商務(wù)應(yīng)用用例。考慮到用戶交互數(shù)量的龐大(對于面對客戶的應(yīng)用,有上百萬個),需要優(yōu)化地共享有限的服務(wù)器端資源。這類資源可能包括數(shù)據(jù)庫、消息隊列、目錄、企業(yè)系統(tǒng) (SAP、CICS) 等等,它們中的每一個都可以由使用代表資源訪問點的連接對象的應(yīng)用來訪問。管理對那些共享資源的訪問對于滿足 J2EE 應(yīng)用的高性能需求來說至關(guān)重要。

連接合用是由數(shù)據(jù)庫供應(yīng)商倡導(dǎo)的技術(shù),其目的是允許客戶機共享一組高速緩存的連接對象,這些對象提供對數(shù)據(jù)庫資源的訪問。在本文中,我分析了 J2EE 環(huán)境中服務(wù)器端資源(例如數(shù)據(jù)庫、消息隊列、目錄和企業(yè)系統(tǒng))的連接合用。

為何合用資源連接?
考慮一下代碼示例,其中,EJB 使用 JDBC 1.0、不使用連接合用來訪問數(shù)據(jù)庫資源。

很明顯,該示例的主要問題是連接的打開和關(guān)閉。考慮到實體 bean 是共享組件,因此,對每個客戶機請求,都要進行幾次獲取和釋放數(shù)據(jù)庫連接的操作。

從圖 1 可以看出,使用 JDBC 1.0 通過數(shù)據(jù)庫管理器獲取和釋放數(shù)據(jù)庫連接將影響 EJB 層的性能。這種影響是由數(shù)據(jù)庫資源管理器進程創(chuàng)建和摧毀那些對象而引起的。應(yīng)用服務(wù)器一般需要花 1 到 3 秒的時間來建立數(shù)據(jù)庫連接(包括與服務(wù)器通信、認證等等),并需要對每一個客戶機 (EJB) 的請求進行連接。

圖 1. 使用 JDBC 1.0 的連接管理


使用服務(wù)供應(yīng)商設(shè)施的連接合用
現(xiàn)在看一下在 J2EE 環(huán)境中,數(shù)據(jù)庫和非數(shù)據(jù)庫資源類型當前可以使用哪些連接合用設(shè)施。

JDBC 2.0 標準擴展 API
JDBC 2.0 標準擴展 API 指定數(shù)據(jù)庫服務(wù)供應(yīng)商可以實現(xiàn)具有以下特性的合用技術(shù):允許請求客戶機透明地共享資源池的多個連接對象。在那種情況下,因為池管理器預(yù)先在啟動時創(chuàng)建連接對象,所以,J2EE 組件可以使用連接對象,而不會導(dǎo)致數(shù)據(jù)庫資源管理器上的系統(tǒng)開銷。應(yīng)用服務(wù)器供應(yīng)商在其內(nèi)存空間實現(xiàn)池管理器,并根據(jù)需要動態(tài)改變池的大小,從而優(yōu)化資源的使用。圖 2 中顯示了這種情況。

圖 2. 使用 JDBC 2.0 標準擴展的連接合用


通過使用 DataSource 接口 (JDBC 2.0) 或 DriverManager (JDBC 1.0) 接口,J2EE 組件可以獲得物理數(shù)據(jù)庫連接對象。要獲得邏輯(合用的)連接,J2EE 組件必須使用以下這些 JDBC 2.0 合用管理器接口:

javax.sql.ConnectionPoolDataSource 接口,該接口充當合用的 java.sql.Connection 對象的資源管理器連接 factory。每家數(shù)據(jù)庫服務(wù)器供應(yīng)商都提供該接口的實現(xiàn)(例如,Oracle 實現(xiàn) oracle.jdbc.pool.OracleConnectionPoolDataSource 類)。
javax.sql.PooledConnection 接口,該接口封裝到數(shù)據(jù)庫的物理連接。同樣,數(shù)據(jù)庫供應(yīng)商提供其實現(xiàn)。
對于那些接口和 XA 連接的每一個,都存在一個 XA(X/Open 規(guī)范)等價定義。

以下代碼示例顯示了 EJB 應(yīng)用如何利用合用的連接對象來訪問數(shù)據(jù)庫資源(基于 JDBC 2.0)。本例中的 EJB 組件使用 JNDI 查詢來確定數(shù)據(jù)庫連接池資源的位置。JNDI 1.2 標準擴展 API 允許 Java 應(yīng)用以相同的方式訪問位于完全不同的目錄和命名系統(tǒng)中的對象。使用 JNDI API,應(yīng)用可以查詢目錄來確定任何資源(例如,數(shù)據(jù)庫服務(wù)器、LDAP 服務(wù)器、打印服務(wù)器、消息服務(wù)器、文件服務(wù)器等等)的位置。有關(guān) JNDI 的合適概述,請參閱 "The Java Naming and Directory Interface (JNDI): A More Open and Flexible Model"。

請注意:實際代碼可能會根據(jù)數(shù)據(jù)庫供應(yīng)商實現(xiàn)類的不同而不同。

以上代碼(使用 JDBC 2.0)和使用 JDBC 1.0 的主要不同在于:getConnection() 從池中獲取已打開的連接,而 close() 只將連接對象釋放回池。如今,幾乎每一家數(shù)據(jù)庫服務(wù)器供應(yīng)商(如 Oracle、DB2、Sybase 和 Informix)都提供 JDBC 2.0 驅(qū)動程序。如今大多數(shù)應(yīng)用服務(wù)器供應(yīng)商(IBM、BEA、iplanet、IONA 等)也都支持 JDBC 2.0。

應(yīng)該說明的一點是:如今,幾乎所有應(yīng)用服務(wù)器都采用兩層連接合用體系結(jié)構(gòu),其中,池位于應(yīng)用服務(wù)器內(nèi)存空間(與獨立的連接代理不同)。

JMS 1.02 標準擴展 API
J2EE 應(yīng)用組件可以使用消息傳遞資源與其它企業(yè)應(yīng)用異步通信。JMS 1.02 標準擴展 API 提供獨立于供應(yīng)商的方式來與消息傳遞服務(wù)供應(yīng)商通信。與數(shù)據(jù)庫資源一樣,通過使用可以合用的連接對象來訪問消息隊列。

JMS 1.02 API 包括下列接口以支持資源合用:

用于 factory 對象的 javax.jms.QueueConnectionFactory 或 javax.jms.TopicConnectionFactory
用于連接對象的 javax.jms.QueueConnection 或 javax.jms.TopicConnection



JMS 服務(wù)供應(yīng)商實現(xiàn)那些接口。代碼樣本顯示了 EJB 組件如何使用連接對象來訪問消息隊列資源。

在連接合用時,JMS factory 類通常要有代理(由管理員配置),以便 open() 和 close() 請求實際上發(fā)往管理連接池的代理。遵循 JMS API 的指示,JMS 服務(wù)器供應(yīng)商可以實現(xiàn)數(shù)據(jù)庫來管理消息隊列。在那種情況下,適當?shù)?JDBC 驅(qū)動程序?qū)⑻峁┻B接合用。如果應(yīng)用已經(jīng)使用 JDBC 2.0 連接池啟用的數(shù)據(jù)庫,那么,您所要做的只是為 JMS 配置 JNDI 特性,以使用那個 JDBC 實例。

JNDI API for LDAP
javax.naming.LDAP 包包括特定于 LDAP 的類(而不包括在通用 javax.naming.directory 中)。與 JDBC 2.0 和 JMS 1.02 API 不同,JNDI LDAP API 不為連接合用指定任何接口。目錄服務(wù)供應(yīng)商可以有選擇地通過 SDK 提供支持。例如,iPlanet 的 Netscape Directory Server SDK 4.0 for Java 包括以下構(gòu)建 LDAP 客戶機所用的類:



public class netscape.ldap.util.ConnectionPool extends java.lang.Object
methods: Connection(), getConnection(), close(), etc.





有關(guān)詳細信息,請參閱 "Netscape Directory Server application Programmer′s Guide"。

J2EE Connector Architecture 1.0
在以上所有示例中,EJB 組件必須導(dǎo)入特定于供應(yīng)商的實現(xiàn)類,以使用資源的連接合用設(shè)施。很明顯,這種做法降低了 EJB 的可移植性,并不利于 J2EE 的發(fā)展。

理想的做法是內(nèi)置一個可用于任何資源類型和所有連接管理功能(包括合用)的通用連接接口。這就是即將出現(xiàn)的 J2EE Connector Architecture 1.0 規(guī)范的目標之一,在我寫這篇文章之時,就已經(jīng)公開了一份草案副本。(請參閱參考資料)。

圖 3 顯示了體系結(jié)構(gòu)內(nèi)部的主要概念,資源適配器。應(yīng)用服務(wù)器所支持的每一種資源類型的可插入組件,資源適配器,都在應(yīng)用服務(wù)器地址空間中執(zhí)行。訪問那些適配器的客戶機 API 可以是 Common Client Interface (CCI) 或(為了向后兼容)特定于資源的 API(例如 JDBC 2.0)。例如,CCI 定義 javax.resource.cci.ConnectionFactory 和 javax.resource.cci.Connection ,分別作為連接 factory 和連接的接口 -- 與上一節(jié)中提到的 JDBC 2.0 接口類似。

圖 3. J2EE Connector Architecture 1.0 中的資源適配器


Connector 1.0 中的連接合用
Connector 1.0 的編程模型如下:

EJB 執(zhí)行連接 factory 的 JNDI 查詢,然后發(fā)出 getConnection() 請求。
連接 factory 將請求委托給 ConnectionManager。
連接管理器在應(yīng)用服務(wù)器中查詢連接池的實例。如果沒有可用的連接池,則管理器使用 ManagedConnectionFactory 來創(chuàng)建一個物理(不合用的)連接。
在那種情況下,假定資源適配器供應(yīng)商實現(xiàn)接口。然而,連接器體系結(jié)構(gòu)并不指定應(yīng)用服務(wù)器如何實現(xiàn)連接池,而是提供一些指示,例如,根據(jù)適配器類型、服務(wù)質(zhì)量 (QoS) 需求等來劃分連接池。有關(guān)詳細信息,請參閱 J2EE Connector Architecture 規(guī)范。




例如,基于即將出現(xiàn)的 EJB 2.0 連接器體系結(jié)構(gòu)的、至企業(yè)/舊有系統(tǒng)的 Sun 連接器的產(chǎn)品版 iPlanet Unified Integration Framework Toolkit v 6.0,為 EJB 層可能要訪問的每個后端系統(tǒng)定義了連接池。一個定期執(zhí)行的線程監(jiān)控池對象的使用和壽命。有關(guān)詳細信息,請參閱 iPlanet Unified Integration Framewor。

EJB 層的設(shè)計考慮事項
盡管有了管理連接池的資源管理器,但是還不能保證 EJB 層具有最優(yōu)性能 -- 還有一些設(shè)計考慮事項!

首先,考慮以下 EJB 客戶機代碼示例,該客戶機訪問實現(xiàn)連接池的 LDAP 目錄 。

import netscape.ldap.util.*;
...
public class NewCustomerBean implements sessionBean {
...
private SessionContext context; // Bean Context
private LDAPConnection lc; // LDAP Connection object
...
public void setSessionContext(SessionContext sc) {
this.context = sc;
// initialize JNDI lookup parameters
Context ctx = new InitialContext(parms);
...
ConnectionPool cp = (ConnectionPool)ctx.lookup(cpsource);
// Establish LDAP Connection.
try {
this.lc = cp.getConnection();
...
}





以上做法有什么不妥嗎?首先,有狀態(tài)會話對象 (NewCustomerBean) 在 setEntityContext 中打開連接對象,然后持續(xù)占用它,直到使用完為止 -- 如果用戶(會話)數(shù)量迅速增加,就成為代價相當大的實現(xiàn)。第二,也是更重要的,因為連接對象不是序列化的,所以,按照 EJB 1.2 規(guī)范,容器可以在鈍化時(例如,將會話 bean 從其活動狀態(tài)移至 bean 實例池)廢棄 bean 實例。

一種替代方法是分別在會話 bean 的 ejbActivate() 和 ejbPassivate() 方法中獲取和釋放資源連接。如果沒有連接池,代價當然會很高,也不會建議那樣做。然而,有了合用之后,使用該技術(shù),可以用最小的 EJB 層開銷來獲取和釋放連接。這里的要點在于:除了規(guī)范和實現(xiàn)所提供的設(shè)施之外,設(shè)計選擇總是關(guān)鍵性能決定因素。

第二個考慮事項是有關(guān)認證問題的。您可能已經(jīng)注意到,合用的連接意味著共享的連接,而共享的連接意味著連接不與特定的認證證書綁定。例如,在 JDBC 2.0 連接中,應(yīng)用服務(wù)器池管理器在啟動時,使用一個存儲在配置文件中的認證證書(通常是用戶標識/口令)來從數(shù)據(jù)庫管理器請求預(yù)設(shè)數(shù)量的連接。有時候,那可能不滿足應(yīng)用的安全性策略。LDAP 連接需要將 LDAP 子樹與特定證書綁定,因而也有同樣的問題。在那些情況下,一種替代方法可能是使用利用特定證書建立好的已高速緩存的連接,它可以對相同類型的證書重復(fù)使用。這種方法的不利之處是已高速緩存的連接要保留很長時間。另一種替代方法可能是對資源使用通用連接,并實現(xiàn)某種應(yīng)用層安全性。

結(jié)束語
在本文中,我根據(jù)資源的共享特性和訪問資源的 EJB 組件,顯示了 J2EE 環(huán)境中連接合用資源的必要。您已看到由 JDBC 2.0、JMS 1.02 和 JNDI 1.2 標準擴展 API 定義的設(shè)施,和供應(yīng)商對那些 API 接口實現(xiàn)的支持。雖然特定于供應(yīng)商的解決方案很健壯,但是對它們的使用卻是以 EJB 的可移植性作為代價的。即將出現(xiàn)的 J2EE Connector Architecture 1.0 解決了該問題,并使資源可插入,從而使 EJB 層從處理特定于供應(yīng)商的庫中解脫出來。最后,我解釋了為什么您的設(shè)計在利用那些合用技術(shù)來制作高性能的 J2EE 應(yīng)用方面扮演著重要角色。

參考資料

"The Java Naming and Directory Interface (JNDI):A More Open and Flexible Model," Richard Monson-Haefel (Java Report Online, SIGS):
http://www.javareport.com/Html/features/archive/9802/haefel.shtml
J2EE Connector Architecture 規(guī)范,1.0 版(公開草案),Sun Microsystems,2000 年 6 月 1 日:
http://java.sun.com/aboutJava/communityprocess/jsr/jsr_016_connect.html
Netscape Directory Server SDK 4.0 Application Programmer′s Guide:
http://docs.iplanet.com/docs/manuals/directory.html
iPlanet Unified Integration Framework,Developers Guide,Sun Microsystems,2000 年 6 月:
http://docs.iplanet.com/docs/manuals/ias.html
關(guān)于作者
Siva Visveswaran 已有三年以上從事 Java 技術(shù)的經(jīng)歷,并曾對 J2EE 深深著迷。最近,他潛心于 Fortune 100 金融服務(wù)公司和 .com 公司的大型復(fù)雜 J2EE 應(yīng)用的體系結(jié)構(gòu)和開發(fā)工作。他有著超過 12 年的 IT 行業(yè)經(jīng)歷,目前正作為大型管理咨詢公司的首席顧問,致力于電子商務(wù)體系結(jié)構(gòu)、基礎(chǔ)設(shè)施技術(shù)和內(nèi)容管理解決方案的工作。Siva 擁有密歇根州底特律 Wayne State 大學的計算機科學碩士學位。可以通過 siva.visveswaran@javaworld.com 與他聯(lián)系。

(出處:http://m.survivalescaperooms.com)



發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 建水县| 卓资县| 信阳市| 阳泉市| 定兴县| 读书| 卫辉市| 云和县| 陆良县| 鱼台县| 土默特左旗| 临沧市| 孙吴县| 卓资县| 股票| 香格里拉县| 中牟县| 桦南县| 那曲县| 鄂尔多斯市| 阿克苏市| 青海省| 广东省| 五河县| 钟山县| 南乐县| 通山县| 穆棱市| 甘孜县| 高尔夫| 定远县| 洛宁县| 普兰店市| 资源县| 永顺县| 莱阳市| 灵丘县| 株洲市| 延边| 安阳市| 安阳市|