本文描述了BEA WebLogic 8.1 Server中各種與JDBC相關功能的配置。盡管我們使用了Oracle 8.1.7作為我們的示例數據庫管理系統(DBMS),但是只要其他關系數據庫提供通過JDBC的連接,就可以很容易地把一般性的概念轉移到這些數據庫上。
JDBC是標准的Java API,幾乎所有需要訪問數據庫的J2EE應用程序都直接或間接地使用了它。在BEA WebLogic 8.1中,配置JDBC連接包括創建和配置兩個主要的工件——JDBC連接池和數據源。與這兩個主要工件相關的是其他次要的可配置工件,比如多池或數據源工廠。
連接池還是多池?
在深入討論如何創建和配置連接池之前,我們需要簡要地看一看需要使用連接池的原因。
如果您沒有使用JDBC連接池訪問數據庫,那麼為了建立到數據庫的連接,您將需要進行以下步驟:
加載JDBC驅動程序類。
創建JDBC驅動程序的一個實例,並把它注冊到驅動程序管理器中。
通過提供一個數據庫URL和其他所需的參數,從驅動程序管理器中獲得一個到數據庫的連接。
完成之後關閉連接。
與這種一次一個連接的方法相比,連接池是數據庫連接的一個現存集合,而且可以在多個活動的J2EE應用程序中回收這些數據庫連接。連接池中的連接是開放的,可用於訪問。應用程序使用一個連接之後,這個連接沒有被銷毀,而是被返回到連接池中,隨後可以為其他應用程序所用。通過節省與頻繁建立和斷開數據庫連接相關的計算資源,連接池提高了數據庫訪問的性能,尤其是在負載高峰期內。
多池是連接池的集合。多池的主要目的是提高可用性和在一組連接池間實現負載均衡。
為什麼使用數據源?
一個數據源就是一個提供對連接池或多池訪問的Java命名和目錄接口(Java Naming and Directory Interface,JNDI)對象。連接池或多池對於配置數據源是必需的。可以使用事務屬性來配置數據源。非事務性的數據源用於本地事務;而事務性的數據源用於分布式事務。
數據源封裝了對數據庫的訪問,隱藏了訪問連接池或多池所涉及的細節。另外,數據源使配置數據庫連接的事務性特性變得容易。
JDBC Data Source Factory是一個JNDI對象,企業應用程序使用它從應用程序范圍內的連接池中獲得連接。
JDBC驅動程序設置
在WebLogic Server和 DBMS之間建立連接所需的JDBC驅動程序分為兩種類型:Type 2和 Type 4。 Type 2 JDBC驅動程序需要本地庫。使用Type 2 JDBC驅動程序時,需要把到WebLogic共享庫(或動態鏈接庫)目錄的路徑<WEBLOGIC>\server\bin\oci817_8和到Oracle客戶端庫目錄的路徑<ORACLE>\bin添加到系統變量< PATH >的開頭部分。
WebLogic 8.1 Server安裝在< WEBLOGIC >目錄中。Oracle 8.1.7數據庫安裝在< ORACLE >目錄中。< PATH >是WebLogic Server Path變量。
對於Type 2和 Type 4驅動程序來說,在WebLogic Server CLASSPATH中,需要相關的JDBC驅動程序類來配置連接池或數據源。把包含Oracle Type 2 JDBC驅動程序類的<ORACLE>\JDBC\lib\classes12.zip文件添加給<domain>/startWebLogic腳本文件中的<CLASSPATH>變量。
<CLASSPATH>:WebLogic Server Classpath變量。
<domain>:WebLogic Server Domain目錄。
配置JDBC連接池
現在,我們將考慮如何創建連接池和配置與其相關的各種參數。
要創建一個JDBC連接池,在Administration Console中右擊JDBC>Connection Pools節點,然後選擇Configure a new JDBC Connection Pool。
這將顯示一個Configure a JDBC Connection Pool畫面。為Oracle數據庫選擇Database Type – Oracle。選擇一個Database Driver,然後點擊Continue按鈕(參見圖1)。
圖1
隨後顯示Define Connection Properties畫面。在這個畫面中,指定一個Database Name、一個Database User Name和一個Password。點擊Continue按鈕。
隨後顯示Test DataBase Connection。在這個畫面中,指定Driver Classname、URL和Properties字段的值。Driver Classname就是用於獲得數據庫連接的驅動程序類名。URL是用於獲得連接的數據庫URL。Properties是用於創建連接的屬性列表。
表1中指定了用於不同Oracle JDBC驅動程序的Driver Classname和URL設置。
表1 驅動程序類名和URL設置
在URL設置中,< host >是在<ORACLE>/network/ADMIN/tnsnames.ora文件中指定的HOST值,<port>是在tnsnames.ora文件中指定的PORT值,而<database>是數據庫實例名稱。
在Properties文本框中的設置是:
user=<user>
server=<database>
<user>是指定登錄到Oracle數據庫中的用戶名。<database>是Oracle數據庫實例名稱。如果使用了Oracle瘦(Type 4)驅動程序,就不應該指定服務器屬性。
點擊Test Driver Configuration按鈕,以測試JDBC Connection Pool。如果驅動程序配置測試成功,會顯示一條“Connection successful”消息。如果驅動程序配置有錯誤,則會顯示一條錯誤消息。
隨後會顯示Create and Deploy畫面。在這個畫面中,選擇一台服務器部署連接池,然後點擊Create and Deploy按鈕來創建和部署一個JDBC連接池。這將在被選中的服務器上創建和部署一個連接池。也可以把它部署在多台服務器上。Administration Console中的JDBC>Connection Pools節點將會增加一個<JDBCConnection Pool>節點。<JDBCConnection Pool>是連接池的名稱。
要修改JDBC Connection Pool配置,點擊JDBC>Connection Pools><JDBCConnection Pool>節點,然後選擇Configuration選項卡。要修改目標服務器,選擇Target and Deploy選項卡。選擇一台目標服務器,然後點擊Apply按鈕。選擇Connections選項卡以配置JDBC Connections屬性。
連接屬性
Initial Capacity:創建連接池時所創建的數據庫連接的數目。
Maximum Capacity: 連接池中連接的最大數目。
Capacity Increment: 連接池容量在最大容量限制范圍內的增量。
LoginDelay: 在創建每個物理數據庫連接之前要延遲的秒數。
Allow Shrinking: 將該項設置為true時,如果沒有使用額外的連接,則允許連接池把容量減小到InitialCapacity。
Shrink Frequency: 在減小連接池容量之前要等待的秒數。如果將Shrink Frequency設置為true,那麼也必須將Allow Shrinking設置為true。
Test Frequency: 數據庫連接測試之間間隔的秒數。在每個Refresh Period時間間隔之後,如果設置了TestTableName,就會使用TestTableName測試未使用的數據庫連接。
Test Reserved Connections: 如果選擇了這個選項,服務器會在把連接提供給客戶端之前對其進行測試。
Test Created Connections: 如果選擇了這個選項,就會在創建一個JDBC連接之後和在把它添加到JDBC連接池中的可用連接列表之前,對該JDBC連接進行測試。
Test Released Connections: 如果選擇了這個選項,服務器就會在把連接返回給連接池之前對其進行測試。
Test Table Name: 用於JDBC連接測試的數據庫表名。如果指定了Test Frequency,並且選擇了Test Reserved Connections、Test Created Connections或Test Released Connections,則Table Name是必需的。
在配置Connections畫面之後,選擇Apply按鈕。
配置JDBC多池
一個多池就是連接池的一個集合。在創建多池之前為多池配置連接池。要創建和配置一個新的多池,右擊Administration Console中的JDBC>Multi Pools節點,然後選擇Configure a New Multi Pool。
隨後會顯示Configuration畫面。在Multi Pool Configuration畫面中,指定Algorithm Type並選擇Create按鈕。如果將Algorithm Type設置為“High availability”,那麼在使用另一個池中的連接之前,一個池中的所有可用連接應已經用完。如果將Algorithm Type設置為“Load balancing”,多池會將連接請求平均地分布給多池中的所有連接池(參見圖2)。
圖2
選擇Pools選項卡,然後在Pools畫面中選擇要添加到多池中的連接池。點擊Apply按鈕。被選中的連接池將被添加到多池中。連接中使用的連接池是基於Algorithm Type進行選擇的。
選擇Target and Deploy選項卡,然後在Target and Deploy畫面中選擇一台目標服務器。點擊Apply按鈕。可以把一個多池部署在多台服務器上。Administration Console中的JDBC>Multi Pools節點將會增加一個<Multi Pool>節點。<Multi Pool>是多池的名稱。
配置JDBC數據源
數據源是用於訪問連接池或多池的JNDI對象。連接池或多池對於創建數據源是必需的。連接池對於創建事務性的數據源是必需的。應在創建數據源之前創建連接池或多池。
要創建和配置數據源,在Administration Console中右擊JDBC>Data Sources節點,然後選擇Configure a new JDBCTxData Source。
隨後會顯示Configuration畫面。在Data Source Configuration畫面中指定字段的設置。JNDI Name是數據源的JNDI路徑。
選擇Honor Global Transactions,以創建一個事務性的(Tx)數據源。如果沒有選中Honor Global Transactions,那麼所創建的數據源就是非Tx數據源(參見圖3)。
圖3
隨後會顯示Connect to Connection Pool畫面。在Pool Name字段中,從可用連接池的列表中選擇一個JDBC連接池,然後點擊Continue按鈕。數據源與被選中的連接池相連接。
隨後會顯示Target the Data Source畫面。在這個畫面中,選擇一台目標服務器,然後點擊Continue按鈕。這將在被選中的服務器上部署數據源,但是也可以在多台服務器上部署它。Administration Console中的JDBC>Data Sources節點將增加一個<JDBCData Source>節點。<JDBCData Source>是數據源的名稱。要修改數據源配置,點擊管理控制台中的JDBC>Data Sources><JDBCData Source>節點,選擇Configuration選項卡。為了可以在一次服務器訪問中把每個Result Set的多個行從服務器取到外部客戶端,選擇Row Prefetch Enabled並指定Row Prefetch Size。要為非XA的JDBC驅動程序啟用全局事務,為非XA的驅動程序選擇Emulate Two-Phase Commit,並選擇Honor Global Transactions。要修改數據源的目標服務器,選擇Target and Deploy選項卡。選擇一台目標服務器,然後點擊Apply按鈕。
數據源和Tx數據源之比較
如果在數據源配置中選擇了Honor Global Transactions,數據源就是Tx數據源。數據源是和連接池或多池一起使用的。Tx數據源和連接池一起使用。數據源用於本地事務。Tx數據源用於分布式事務。
在下列情況下,應該使用Tx數據源而不是數據源:
使用容器托管的持久性實體bean。
在事務期間訪問多項資源。
在一個事務中進行多個數據庫更新。
在多台服務器上使用同一個連接池。
配置JDBC數據源工廠
JDBC數據源工廠是一項JNDI數據源資源。企業應用程序使用數據源工廠從應用程序范圍內的連接池中獲得連接。
要創建和配置一個JDBC數據源工廠,在Administration Console中右擊JDBC>Data Source Factories節點,然後選擇Configure a new JDBCDataSourceFactory。
隨後會顯示Configuration畫面。在這個畫面中,指定URL、Driver Class Name、 Factory Name和Properties字段的值,然後點擊Create按鈕(參見圖4)。
圖4
Administration Console中的JDBC>Data Source Factories節點將增加一個<JDBCData Source Factory>節點。<JDBCData Source Factory>是數據源工廠的名稱。要使用<JDBCData Source Factory>,需要重新啟動服務器。
JDBC配置和服務器性能
下面列出了BEA針對 WebLogic Server的各種JDBC配置設置給出的建議。
為了提高生產模式下服務器的性能:
在JDBC連接池配置中,把InitialCapacity的值設置為等於 MaxCapacity。如果InitialCapacity的值小於MaxCapacity,那麼當負載增加時,服務器就會創建額外的數據庫連接。在負載增加的情況下,必須分配資源以創建額外的數據庫連接,同時資源對於完成jdbc客戶端請求也是必需的。
把MaxCapacity的值設置為等於需要JDBC連接的並發客戶端會話的數量:為了確定一個連接池中的並發客戶端會話,選擇該連接池節點。選擇Monitoring選項卡。Active Connections欄中的值是並發客戶端會話的平均數目。Connections High的值是並發客戶端會話的最大數量。在部署應用程序和監視活動連接之後,可以修改MaxCapacity的值。
當外部客戶端通過WebLogic Server使用JDBC訪問數據庫時,在數據源配置中選擇Row Prefetch Enabled:通過在一次服務器訪問中取多個行,行預取可以提高性能。
結束語
按照上面概述過程,WebLogic開發人員應該能夠針對Oracle 8.1數據庫配置BEA WebLogic 8.1 Server了。配置其他數據庫類似於配置Oracle 8.1。把包含相應數據庫的驅動程序類的zip/jar文件添加給CLASSPATH變量,然後在JDBC連接池配置中指定相應的連接URL和驅動程序類名。