您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“WAS 5.x中數(shù)據(jù)源的配置使用及其常見問題有哪些”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!
1.簡單原理和背景介紹
1.1 什么是數(shù)據(jù)源?為什么要使用數(shù)據(jù)源?
我們先來看一下使用JDBC1.0的時候,一般是怎樣來連接數(shù)據(jù)庫的。
代碼片斷示例1:
java.sql.Connection con = null; try { Class.forName("COM.ibm.db2.jdbc.app.DB2Driver"); con = java.sql.DriverManager.getConnection("jdbc:db2:DBName"); } catch (Exception e) { System.err.println("Exception: " + e.getMessage()); } |
由于建立一個數(shù)據(jù)庫連接是一種比較耗時的操作,在使用JDBC1.0的時候,如果要提高性能就需要應(yīng)用程序自己對連接進行緩存處理。但是在JDBC2.0 以一個附加的 API 的方式引入了標準連接池的特性,這個附加的 API 叫做 JDBC 2.0 可選包(也稱作 JDBC 2.0 標準擴展)。這樣對于支持JDBC2.0的數(shù)據(jù)庫(一般是指JDBC驅(qū)動程序支持),WebSphere應(yīng)用服務(wù)器提供了連接池的支持。JDBC2.0 API 為連接池提供了一個客戶端和一個服務(wù)器端的接口??蛻舳私涌谑?span lang="EN-US"> javax.sql.DataSource,通常就是應(yīng)用代碼用來請求一個緩沖了的數(shù)據(jù)庫連接的東西。這個數(shù)據(jù)源就是生成數(shù)據(jù)庫連接對象的工廠。服務(wù)器接口是 javax.sql.ConnectionPoolDataSource,通常是大多數(shù)應(yīng)用服務(wù)器和數(shù)據(jù)庫JDBC驅(qū)動打交道的接口。
連接池可改進任何需要連接的應(yīng)用程序(特別是基于 Web 的應(yīng)用程序,Web 用戶的連接和斷開更為頻繁)的響應(yīng)時間。因為連接池的實現(xiàn),在客戶端調(diào)用 close()方法的時候?qū)嶋H上并不關(guān)閉連接,而是把連接返回到一個可重用連接的連接池中給其它客戶端使用。這樣就避免了任何重復(fù)打開和關(guān)閉數(shù)據(jù)庫連接造成的開銷,并且允許大量的客戶端分享相對較少的數(shù)據(jù)庫連接,從而提高數(shù)據(jù)庫操作的性能。為了使用應(yīng)用服務(wù)器提供的連接池功能,我們需要先定義相應(yīng)的數(shù)據(jù)源。數(shù)據(jù)源在WebSphere應(yīng)用服務(wù)器中作為資源存在,因此可以統(tǒng)一通過JNDI來查詢它們。
使用數(shù)據(jù)源的代碼片斷示例2:
try{ javax.naming.InitialContext ctx = new javax.naming.InitialContext(); javax.sql.DataSource ds = (javax.sql.DataSource)ctx.lookup("jdbc/DSName"); java.sql.Connection con = ds.getConnection(); }catch(javax.naming.NamingException e1){ System.err.println("Naming-Exception: " + e1.getMessage()); }catch (java.sql.SQLException e2) { System.err.println("Naming-Exception: " + e2.getMessage()); } |
//裝載JDBC驅(qū)動程序 java.sql.DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); //設(shè)置數(shù)據(jù)庫連接字符串 java.lang.String strConn = "jdbc:oracle:thin:@hostname/IP:1521:SIDName"; //連接數(shù)據(jù)庫 java.sql.Connection sqlConn = java.sql.DriverManager.getConnection(strConn,"userName","passWord"); |
這種方式需要把數(shù)據(jù)庫的用戶名和口令放在程序的源代碼中。而在WebSphere應(yīng)用服務(wù)器中我們可以在定義數(shù)據(jù)源的時候通過J2C認證的方式配置數(shù)據(jù)庫訪問別名,從而提升安全性。另外,這種方法也更靈活,如果數(shù)據(jù)庫用戶名或口令發(fā)生變化不需要更改應(yīng)用程序代碼。
1.2 WebSphere應(yīng)用服務(wù)器中數(shù)據(jù)源所處的位置
很多人在剛開始配置WebSphere應(yīng)用服務(wù)器數(shù)據(jù)源時對J2C認證別名很不習慣,覺得JDBC的東西怎么會與J2C扯上關(guān)系。我們知道基于J2EE的WEB應(yīng)用在與后臺EIS(企業(yè)信息系統(tǒng))集成的過程中,根據(jù)EIS的不同主要有三種連接方式,分別是JDBC,JCA/J2C和JMS。從理論上講,JDBC驅(qū)動程序是可能歸納成一種特殊的JCA連接器,只不過這個連接器后面恰好連接著關(guān)系型數(shù)據(jù)庫。至于實際標準如何發(fā)展,讓我們拭目以待。下面我們看一下WebSphere應(yīng)用服務(wù)器中數(shù)據(jù)庫連接及持久性管理的示意圖。
2.如何在WebSphere應(yīng)用服務(wù)器中配置數(shù)據(jù)源我們首先概要的看一下在WebSphere應(yīng)用服務(wù)器中配置和使用數(shù)據(jù)源所涉及的幾個環(huán)節(jié)。一般的,配置數(shù)據(jù)源的基本步驟如下:
首先要確認所用的數(shù)據(jù)庫是支持JDBC2.0的,并確保我們的操作系統(tǒng)環(huán)境設(shè)置為支持 JDBC 2.0。這是使用 WebSphere應(yīng)用服務(wù)器創(chuàng)建的數(shù)據(jù)源所必需的。這一點在使用UDB DB2 7.2的時候尤其要注意。
要確定使用哪個數(shù)據(jù)源:數(shù)據(jù)源V4.0還是 V5.0 數(shù)據(jù)源。數(shù)據(jù)源V4.0是使用 WebSphere 舊連接管理器體系結(jié)構(gòu)的 WebSphere 4.x 中的數(shù)據(jù)源,所有的 EJB1.x 模塊都必須使用此數(shù)據(jù)源。 WebSphere應(yīng)用服務(wù)器5.x提供對 V4.0 的 JDBC 連接管理器模型的支持,使得 J2EE 1.2 應(yīng)用程序能夠不經(jīng)改變地運行。WAS 5.x 也支持J2EE 1.3的應(yīng)用, J2EE 1.3 應(yīng)用程序內(nèi)的 EJB 2.0 模塊,WEB 2.3模塊需要使用 V5.0的JDBC 連接管理器。
創(chuàng)建 JDBC 提供程序。JDBC提供程序指的是JDBC驅(qū)動程序的類型及其相應(yīng)的驅(qū)動程序?qū)崿F(xiàn)JAVA包。
創(chuàng)建數(shù)據(jù)源。數(shù)據(jù)源是在提供特定 JDBC 驅(qū)動程序?qū)崿F(xiàn)類的 JDBC 提供程序下創(chuàng)建的。
綁定資源引用。J2EE 1.3標準推薦使用數(shù)據(jù)源的引用而不是直接使用數(shù)據(jù)源的名稱。
測試連接。WebSphere應(yīng)用服務(wù)器5.0.x及5.1提供了數(shù)據(jù)源配置頁面上提供了測試數(shù)據(jù)源連接的測試按鈕。
接下來,我們對數(shù)據(jù)源配置中的最為重要的兩步,即創(chuàng)建 JDBC提供程序時的配置步驟和創(chuàng)建數(shù)據(jù)源時的配置過程進行詳細描述。 2.1 配置JDBC提供程序如果是第一次配置數(shù)據(jù)源連接,需要配置JDBC提供程序。配置JDBC提供程序的步驟如下:登錄WAS管理控制臺頁面,單擊資源 -> JDBC 提供程序 -> 選擇相應(yīng)的作用域 -> 新建 -> 選擇相應(yīng)的JDBC提供程序類型。 2.1.1 選擇JDBC提供程序的作用域指定JDBC提供程序的作用域,如下圖所示。
的設(shè)置取決于實際WebSphere應(yīng)用服務(wù)器的拓撲結(jié)構(gòu)。一般有以下三種作用域:
單元
最常規(guī)的作用域。在“單元”作用域上定義的資源對于所有節(jié)點和服務(wù)器都是可見的,除非它們被覆蓋了。要查看單元作用域中定義的資源,不要在作用域選擇表單中指定服務(wù)器或節(jié)點名。
節(jié)點
多數(shù)資源類型的缺省作用域。在“節(jié)點”作用域上定義的資源覆蓋任何在“單元”作用域上定義的重復(fù)項,并且對于相同節(jié)點上的所有服務(wù)器都是可見的,除非它們在該節(jié)點上的服務(wù)器作用域中被覆蓋了。要查看節(jié)點作用域中定義的資源,不要指定服務(wù)器,但是要在作用域選擇表單中選擇節(jié)點名。
服務(wù)器
定義資源的最特定作用域。在“服務(wù)器”作用域上定義的資源覆蓋任何在“單元”作用域或父“節(jié)點”作用域上定義的重復(fù)資源定義,并且它們僅對于特定服務(wù)器是可見的。要查看服務(wù)器作用域中定義的資源,在作用域選擇表單中指定服務(wù)器名和節(jié)點名。
以看出上面三個作用域的范圍逐漸遞減,并且同名的資源以最小范圍的為準。這個有點類似編程語言中變量的作用域。根據(jù)上面作用域的范圍的描述,在單節(jié)點的情況下,一般選用“節(jié)點”。如果只有一個應(yīng)用服務(wù)器實例也可以選擇“服務(wù)器”。在多個節(jié)點構(gòu)成的單元中,可以分別在每個節(jié)點上分別定義,也可以選擇“單元”作用域一次性定義。
2.1.2 選擇JDBC提供程序
使用下拉列表選擇要創(chuàng)建的 JDBC 提供程序類型,如下圖所示。
如果支持的 JDBC 提供程序類型列表不包含我們要使用的 JDBC 提供程序,則選擇用戶定義的 JDBC 提供程序(User-defined JDBC Provider)。如果數(shù)據(jù)源需要兩階段提交(2PC)的支持,那么在選擇JDBC驅(qū)動程序時需要選擇帶XA支持的驅(qū)動程序。請查詢 JDBC 提供程序供應(yīng)商文檔以獲取特定的必需屬性信息。 2.1.3 JDBC提供程序的屬性 JDBC提供程序的常規(guī)屬性頁如下圖所示:
這個頁面中最為重要的設(shè)置是類路徑。它是指定共同組成資源提供程序類的位置路徑或 JAR 文件名的列表,也即JDBC驅(qū)動程序類包。大部分常見數(shù)據(jù)庫的JDBC驅(qū)動程序都以jar文件或zip文件的形式提供。例如 DB2 7.2的JDBC驅(qū)動程序文件名為db2java.zip,Oracle 8.1.7的JDBC驅(qū)動程序文件名為classes12.zip,Sybase 12的JDBC驅(qū)動程序文件名為jconn2.jar等。在WebSphere應(yīng)用服務(wù)器5.1中,類路徑的缺省值反映了相應(yīng)數(shù)據(jù)庫更新的JDBC驅(qū)動程序,例如Oracle 9i的ojdbc14.jar。類路徑缺省值中還帶有一個相應(yīng)的WebSphere變量,我們可以用絕對路徑替換或定義此WebSphere變量的值。
實現(xiàn)類名指定 JDBC 驅(qū)動程序?qū)崿F(xiàn)的 Java 類名。此類可用于上面的“類路徑”描述中提到的驅(qū)動程序文件,例如 COM.ibm.db2.jdbc.DB2XADataSource。一般不需要手工填入,采用缺省值即可。但是如果前面JDBC提供程序類型選了User-defined JDBC Provider的話就需要自己修改這個值。
修改完這些屬性之后按確定并保存就完成了JDBC提供程序的配置。這樣我們就可以在JDBC提供程序的列表中找到我們定義的JDBC提供程序(注意選擇正確的作用域并點擊應(yīng)用按鈕)。
2.2 配置數(shù)據(jù)源
創(chuàng)建 JDBC 提供程序后,我們就可以創(chuàng)建數(shù)據(jù)源以訪問后端數(shù)據(jù)存儲。創(chuàng)建新的 V 5.0 數(shù)據(jù)源的步驟基本如下:
打開WAS5.x管理控制臺。
單擊資源 -> JDBC 提供程序。
選擇相應(yīng)的作用域選項以找要為其創(chuàng)建數(shù)據(jù)源的 JDBC 提供程序。
選擇我們要創(chuàng)建數(shù)據(jù)源的 JDBC 資源提供程序,會出現(xiàn)此提供程序的詳細信息頁面。
如果我們要創(chuàng)建 V5.0 數(shù)據(jù)源,則單擊“其它特性”中的數(shù)據(jù)源。
單擊新建以顯示數(shù)據(jù)源的配置頁面,如下圖所示。
這個頁面中的幾個重要的設(shè)置如下。名稱:指定當前數(shù)據(jù)源的顯示名稱。 JNDI名:指定當前數(shù)據(jù)源的JNDI名稱。其缺省值為“jdbc/顯示名稱”。容器受管持久性:指定此數(shù)據(jù)源是否用于企業(yè) bean 的容器管理的持久性。如果選擇此復(fù)選框,則為關(guān)系資源適配器創(chuàng)建與此數(shù)據(jù)源相應(yīng)的 CMP 連接器工廠。一般的,如果應(yīng)用程序中有CMP,則需要選上此項。CMP容器生成的JNDI名稱為eis/數(shù)據(jù)源名稱_CMP,這個值在發(fā)布含有CMP的應(yīng)用時綁定使用。語句高速緩存大小:每個連接的空閑已準備語句(PreparedStatement)數(shù),也即已準備語句緩存的數(shù)目,用以提供性能。如果我們將此數(shù)設(shè)置得過高,我們會缺乏資源,因為系統(tǒng)無法打開那么多已準備語句。一般采用缺省值即可。組件受管認證別名:此別名用于運行時的數(shù)據(jù)庫認證。如果我們的應(yīng)用程序資源認證(res-auth)設(shè)置為應(yīng)用程序,則在“組件管理的認證別名”中設(shè)置別名。容器受管的認證別名:此別名用于運行時的數(shù)據(jù)庫認證。如果我們的應(yīng)用程序資源認證(res-auth)設(shè)置為容器,則設(shè)置“容器管理的認證別名”。 WAS5的數(shù)據(jù)源用J2C的安全認證方式,故一般不需要在應(yīng)用級別設(shè)置用戶名和口令,而必須定義一個J2C的認證別名。如果我們的數(shù)據(jù)庫(例如 Cloudscape)不支持用戶標識和密碼,則不要在“組件管理的認證別名”或“容器管理的認證別名”字段中設(shè)置別名。如果沒有事先定義好J2C認證別名(通過管理控制臺的安全性 -> JAAS配置 -> J2C認證數(shù)據(jù)),上面的兩個下拉列表中是沒有相應(yīng)的J2C認證別名的??梢酝ㄟ^點擊應(yīng)用按鈕,在數(shù)據(jù)源屬性頁面的最下面出現(xiàn)“相關(guān)項”,如下圖所示。
再點擊J2C認證數(shù)據(jù)條目鏈接,然后點擊新建按鈕就可以進入到定義它的頁面,如下圖所示。
上述頁面中的別名就是標識這個J2C認證數(shù)據(jù)條目的,也即出現(xiàn)在數(shù)據(jù)源定義頁中容器受管的認證別名和組建受管認證別名列表中的名字。用戶名和密碼對應(yīng)目標數(shù)據(jù)庫的用戶名和密碼。點擊確定并保存。
· 現(xiàn)在通過點擊相應(yīng)JDBC提供程序的數(shù)據(jù)源鏈接,可以看到前面定義的數(shù)據(jù)源。進入數(shù)據(jù)源的配置頁面,在相應(yīng)的認證別名的列表中選擇剛才定義的認證別名。
· 選擇其它屬性欄目中的定制屬性進入數(shù)據(jù)源的定制屬性頁。這個頁面中要定義的屬性與所選數(shù)據(jù)庫類型有關(guān)。一般的,對于DB2數(shù)據(jù)庫,必須的屬性是databaseName,即所對應(yīng)數(shù)據(jù)庫名字。對于Oracle數(shù)據(jù)庫,必須的屬性是URL,如jdbc:oracle:thin:@localhost:1521:sample。修改完定制屬性之后,點擊確定并保存修改。
· 我們已定義和保存數(shù)據(jù)源之后,可以單擊測試連接按鈕以確保此數(shù)據(jù)源定義中的參數(shù)是正確的。在數(shù)據(jù)源列表頁上,我們可以同時選擇多個數(shù)據(jù)源并測試它們。一般配置完數(shù)據(jù)源之后不需要重新啟動服務(wù)器,就可以測試成功。但是注意如果我們添加新的 WebSphere 環(huán)境變量或修改它,必須重新啟動進程(網(wǎng)絡(luò)部署環(huán)境下還要重啟Node Agent 和 Deployment Manager)使這些變量生效。
· 至此,數(shù)據(jù)源的基本配置就完成了。但是在很多情況下我們還要對連接池的屬性進行調(diào)整。通過點擊數(shù)據(jù)源配置頁面中其它屬性的連接池鏈接,可以得到連接池的配置頁面,如下圖所示。
這個配置頁面的幾個重要屬性說明如下:
連接超時:這個值指定當連接池達到給定連接池的最大值(最大連接數(shù))時所等待的時間。當超過這個時間還是沒有空閑連接時,連接請求超時并拋出 ConnectionWaitTimeoutException。如果連接超時設(shè)置為 0,則只要必需,池管理器就會等待直到分配一個連接為止(這在連接數(shù)下降到最大連接數(shù)值以下時發(fā)生)。
最大連接數(shù)和最小連接數(shù):這兩個參數(shù)分別指定可以在此池中創(chuàng)建的最大物理連接數(shù)和最小物理連接數(shù)。應(yīng)用服務(wù)器啟動的時候,連接池并不建立連接。只有當應(yīng)用程序請求數(shù)據(jù)庫連接時,連接池才開始建立連接。當連接池中的連接數(shù)達到最小連接數(shù)之后,此后根據(jù)實際應(yīng)用程序?qū)?shù)據(jù)庫連接的需求,連接池中的連接數(shù)就保持在最小連接數(shù)和最大連接數(shù)之間??梢愿鶕?jù)應(yīng)用程序?qū)?shù)據(jù)庫連接的要求調(diào)整這兩個參數(shù)。
不使用超時:這個參數(shù)指定一個空閑連接在連接池中能夠存活的最大時間。因為在連接池中保持連接會消耗系統(tǒng)資源,因此超過最小連接數(shù)的空閑連接會被定時清除。不使用超時設(shè)為0時就不清除空閑連接。
獲得時間:連接池中的連接由一個定時運行的線程進行維護。這個參數(shù)就是指定運行連接池維護線程之間的間隔。例如,如果“獲得時間”設(shè)置為 60,則池維護線程每 60 秒運行一次。當池維護線程運行時,它廢棄所有未使用的連接(未使用時間長于“不使用超時”中指定的時間值),直到它到達最小連接數(shù)中指定的連接數(shù)。池維護線程還廢棄所有活動時間長于“時效超時”中指定的時間值的連接。獲得時間間隔還影響性能,因為更短的間隔意味著池維護線程將更頻繁的運行并降低性能。要禁用池維持線程,“獲得時間”設(shè)置為 0,或“不使用超時”和“時效超時”都設(shè)置為 0。
時效超時:這個參數(shù)指應(yīng)用在獲得連接之后而不使用它的最大空閑時間。超過大概兩倍時效超時,這個空閑連接將被強行放回到連接池(注:這個工作也是由連接池維護線程來做的,因為整個過程要等待兩個時效超時,因此總超時時間大概是時效超時的兩倍)。如果在放回到連接池之后,應(yīng)用再去使用這個連接就會報StaleConnectionException異常。這個參數(shù)對事務(wù)處理中的連接不生效。時效超時設(shè)為0時這個參數(shù)就不生效。這里有一點要注意,雖然WebSphere應(yīng)用服務(wù)器可以通過設(shè)置這個參數(shù)可以回收應(yīng)用程序中忘記釋放的數(shù)據(jù)庫連接,但是在大并發(fā)量用戶訪問的時候還是會導(dǎo)致數(shù)據(jù)庫連接不夠用的異常。因此,盡量保證應(yīng)用程序中使用完數(shù)據(jù)庫連接之后及時放回到連接池中去。
上面三個參數(shù)之間是有一定聯(lián)系的。不使用超時和時效超時都是由連接池維護線程來進行維護和判斷的,因此真正的超時生效時間有時要比設(shè)定的大,理論上最大值為不使用超時或時效超時再加上獲得時間。另外,應(yīng)該將“獲得時間”值設(shè)置為小于“不使用超時”和“時效超時”的值,否則后兩個參數(shù)的意義就打折扣了。
“WAS 5.x中數(shù)據(jù)源的配置使用及其常見問題有哪些”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。