分布式計算環境通常使用命名和目錄服務來獲取* * * *所享有的組件和資源。命名和目錄服務將名稱與位置、服務、信息和資源相關聯。
命名服務提供名稱-對象映射。目錄服務提供關於對象的信息和定位它們所需的搜索工具。有許多命名和目錄服務實現,它們的接口是不同的。
Java命名和目錄接口或JNDI為訪問不同的命名和目錄服務提供了壹個公共接口。有關支持通過JNDI接口訪問命名和目錄服務的供應商列表,請參見URL java.sun.com/products/jndi/serviceproviders.html。
JNDI(Java命名和目錄接口)
在開發企業beans時,JNDI非常重要,因為對EJB的訪問是通過JNDI的命名服務完成的。使用命名服務來查找與特定名稱相關的對象。在EJB上下文中,命名服務找到壹個企業bean並給它命名。因此,在開發EJB應用程序時,理解JNDI非常重要。此外,JDBC可以使用JNDI訪問關系數據庫。
附:JNDI教程
/products/JNDI/tutorial/index . html
(下載)
/products/JNDI/docs . html #教程
JDBC2.0擴展API(1)
[作者:未知添加日期:2001-8-24 14:11:50]
資料來源:www.csdn.net。
JDBC 2.0 API分為兩部分:JDBC 2.0核心API和JDBC 2.0標準擴展API。核心API在java.sql中這是原始版本中實現的基本功能。標準的擴展API在javax.sql中,JDBC2.0規範指定的壹些新接口在其中。當然,JDBC2.0也對java.sql核心的原始版本做了壹些改動。但不是很大。原來的JDBC1.0程序不需要修改就可以在JDBC2.0上運行。這是Java壹貫的好作風。最新的JDBC軟件包可以從sun的網站上下載。
JDBC2.0的擴展API增加了壹些數據訪問和數據源訪問的重要功能。其中壹些主要用於企業計算。借助JDBC2.0的新擴展包,JDBC提供了壹種來自JAVA2平臺的通用數據訪問方法。
首先,我們來看看JDBC標準擴展的API是如何與JDBC2.0結合的,JDBC2.0包括兩個包:
1,java.sql包,這是JDBC2.0的核心API,它包括了原來的JDBC API(JDBC 1.0版本),加上壹些新版本的2.0 APIs。這個包在Java 2平臺SDK中提供。
2,javax.sql包,這是JDBC2.0的標準擴展API,這個包是全新的,在Java 2 Platform SDK,Enterprise Edition中單獨提供。
JDBC2.0的核心API包括JDBC1.0的API,並在此基礎上增加了壹些功能,增強了壹些性能。java語言在數據庫計算前端提供了統壹的數據訪問方法,效率也得到了提高。
JDBC是向後兼容的,JDBC1.0的程序不需要修改就可以在JDBC2.0上運行。但是,如果程序使用JDBC2.0的新功能,它必須在JDBC2.0上運行。
綜上所述,JDBC核心API的新特性在兩個方面做了工作。壹是支持壹些新的函數,二是支持SQL3數據類型。
1.在支持新功能方面,包括結果集可以向後滾動,數據可以批量更新。此外,它還提供了UNICODE字符集的字符流操作。
2.在支持SQL3數據類型方面:包括新的SQL3數據類型,增加了持久對象的存儲。
為了更方便地訪問數據和操作,JDBC的新特點是應用程序的設計更容易。例如,對數據塊的操作可以顯著提高數據庫訪問的性能。新添加的BLOB、CLOB和array接口可以是應用程序可以操作的大型數據類型,在存儲之前無需客戶端進行任何其他處理。這樣內存的使用效率顯著提高。
下面介紹壹下JDBC2.0的標準擴展API,標準擴展API分為以下幾個方面:
1,DataSource接口:與Java目錄服務(JNDI)壹起工作的數據源接口。它提供了對數反吹指?梅木?老婆辣椒ā?br & gt;2.連接池:您可以重用連接,而不是為每個請求使用壹個新的連接。
3.分布式事務:壹個事務涉及多個數據庫服務器。
4.Rowsets:JavaBean組件包含結果集,主要用於向瘦客戶傳輸數據或提供可滾動的結果集。
讓我們逐壹介紹:
首先,DataSource接口是連接數據源的更好方式:
JDBC1.0最初使用DriverManager類來生成到數據源的連接。JDBC2.0使用了壹種替代的方法,使用DataSource的實現,代碼變得更小,更精致,更容易控制。
DataSource對象表示真實的數據源。根據數據源的實現方式,數據源可以是關系數據庫、電子表格或表格文件。當DataSource對象在名稱服務中註冊時,應用程序可以通過名稱服務獲得DataSource對象,並使用它來創建與DataSource所表示的datasource的連接。
關於數據源以及如何定位數據源的信息,例如數據庫服務器的名稱、它位於哪臺機器上、端口號等。,都包含在datasource對象的屬性中。這樣,應用程序的設計就更方便了,因為不需要把驅動程序的名字寫進程序裏。通常,驅動程序名稱包括驅動程序提供者的名稱,這通常在DriverManager類中完成。如果要將數據源移植到另壹個數據庫驅動程序,可以很容易地修改代碼。需要修改的只是改變DataSource的相關屬性。使用DataSource對象的代碼不需要更改。
DataSource對象由系統管理員或具有適當權限的人配置。配置數據源,包括設置數據源的屬性,然後在JNDI名稱服務中註冊。在註冊DataSource對象的過程中,系統管理員需要將DataSource對象與壹個邏輯名稱相關聯。名稱可以是任意的,通常是能代表數據源且容易記憶的名稱。在下面的例子中,名稱是InventoryDB,按照慣例,邏輯名稱通常在jdbc的子上下文中。這樣邏輯名的全稱就是:jdbc/ InventoryDB。
壹旦配置了數據源對象,應用程序設計人員就可以使用它來創建與數據源的連接。下面的代碼片段演示了如何獲取具有JNDI上下文的數據源對象,然後如何使用數據源對象與數據源建立連接。前兩行使用JNDI API,第三行使用JDBC API:
context CTX = new initial context();data source ds =(data source)CTX . lookup(" JDBC/inventory db ");connection con = ds . getconnection(" my password "," my username ");
在基本DataSource實現中,DataSource.getConnection方法返回的連接對象與DriverManager.getConnection方法返回的連接對象相同。由於DataSource提供的便利,我們建議使用DataSource對象來獲取壹個連接對象。我們希望所有基於JDBC2.0技術的數據庫驅動程序都包含壹個DataSource的基本實現,這樣就可以方便地在應用程序中使用。
對於普通的應用程序設計人員來說,是否使用DataSource對象只是壹個選擇的問題。然而,對於需要使用連接池或分布式事務的應用程序設計人員來說,他們必須使用DataSource對象來獲得連接,原因我們將在下面提到。
二、連接池(Connection pooling):
連接池是這樣壹種機制,當應用程序關閉連接時,連接將被回收而不是銷毀,因為建立連接是壹項資源密集型操作。如果回收的連接可以重用,那麽新創建的連接數量將會減少,運行性能將會顯著提高。
假設應用程序需要建立到名為EmpolyeeDB的數據源的連接。使用連接池獲取連接的代碼如下:
context CTX = new initial context();data source ds =(data source)CTX . lookup(" JDBC/EmployeeDB ");connection con = ds . getconnection(" my password "," my username ");除了邏輯名稱之外,我們發現代碼與上面給出的示例相同。不同的邏輯名稱可以連接到不同的數據庫。DataSource對象的getConnection方法返回的連接是否是連接池中的連接,完全取決於DataSource對象的實現方法。如果DataSource對象實現與支持連接池的中間層服務器壹起工作,DataSource對象將自動返回連接池中的連接,並且該連接也可以被重用。
是否使用連接池來獲取連接與應用程序代碼沒有區別。使用這個連接Connection沒有什麽不同,唯壹的區別就是在java的finally語句塊中關閉壹個連接。在finally中關閉連接是壹個好的編程習慣。這樣,即使方法拋出異常,連接也會被關閉並回收到連接池中。代碼應該如下所示:
嘗試{…
}catch(){…
}最後{ if(con!= null)con . close();}
第三,分布式交易:
獲取支持分布式事務的連接與獲取連接池中的連接非常相似。同樣,區別在於DataSource的實現,而不在於應用程序中獲取連接的方式。假設DataSource的實現可以與支持分布式事務的中間層服務器壹起工作,連接的代碼如下:
context CTX = new initial context();data source ds =(data source)CTX . lookup(" JDBC/EmployeeDB ");connection con = ds . getconnection(" my password "," my username ");出於性能原因,如果數據源可以支持分布式事務,它也可以支持連接池管理。
從應用程序設計者的角度來看。是否支持分布式事務的連接沒有區別。唯壹的區別是,在事務的邊界上(事務開始和結束的地方),事務的開始或結束由事務服務器控制。應用程序不應該做任何可能幹擾服務的事情。應用程序不能直接調用事務提交或回滾操作,也不能使用事務的自動提交模式(在數據庫操作完成時自動調用提交或回滾)。
當壹個連接參與分布式事務時,妳不能做下面的代碼(con代表支持分布式事務的連接)。
con . commit();或者con . roll back();或con.setAutoCommit(真);對於通常的連接,默認是自動提交模式。對於支持分布式事務的連接,默認值不是自動提交模式。註意,即使Connection支持事務,也可以在沒有事務的情況下使用。對事務邊界的限制僅在分布式事務的情況下建立。
在配置支持連接池的DataSource時,涉及到配置ConnectionPoolDataSource對象,它是三層架構中管理連接池的中間層。類似地,當配置為支持分布式事務時,您需要配置XADataSource,它是中間層用來管理分布式事務的對象。ConnectionPoolDataSource和XADataSource由驅動程序提供者提供,對應用程序設計者是透明的。與基本數據源壹樣,系統管理員配置ConnectionPoolDataSource和XADataSource對象。
第四,結果集:
結果集對象是數據行的容器。根據其目的,可以通過多種方式實現。行集及其相關接口與JDBC2.0的標準擴展API略有不同。它們不是驅動程序的壹部分。行集是在驅動程序的上層實現的,可以由任何其他人實現。
任何類型的行集都實現行集接口,該接口擴展了ResultSet接口。這樣,行集對象具有ResultSet對象的所有功能。可以通過getXXX方法獲取數據庫中的壹列值,通過updateXXX方法修改壹列值,移動光標,使當前行成為另壹行。
當然,我們更感興趣的是行集接口提供的新函數。作為JavaBean組件,RowSet對象可以添加或刪除偵聽器,並可以獲取或設置其屬性值。其中壹個屬性是字符串,它表示對數據庫的查詢請求。行集接口定義了設置參數的方法,還提供了執行此請求的方法。這意味著行集對象可以執行查詢請求,並可以根據它產生的結果集進行計算。類似地,行集也可以從任何表格數據源計算,因此它不限於關系數據庫。
從數據源獲取數據後,行集對象可以與數據源斷開連接,並且行集可以被序列化。這樣,行集就可以通過網絡傳遞到瘦客戶端。
行集可以重新連接到數據源,以便可以將更改保存回數據源。如果生成了偵聽器,則在行集的當前行移動或數據被修改時,偵聽器會得到通知。例如,圖形用戶界面模塊可以註冊為監聽器。當行集發生更改時,圖形用戶界面會得到通知,並且可以修改該界面以符合它所代表的行集。
根據不同的需要,行集接口可以有多種實現方式。Java軟件寫了壹個CachedRowSet實現,可以從/developer/early access/CRS/index . html獲取。
與CachedRowSet類不同,JDBCRowSet類始終保持與數據源的連接。這樣,就像在ResultSet周圍加壹層壹樣簡單,但是基於JDBC技術的驅動看起來就像壹個簡單的JavaBean組件。
總結:JDBC2.0標準擴展API通過DataSource向JNDI名稱服務註冊,將JDBC技術擴展為壹個全新的概念。讓應用程序代碼更加精致,易於控制。新的API支持連接池和分布式事務。最後,它還使java應用程序能夠在網絡上傳播結果集,從而使不可滾動的結果集成為可滾動的行集。