企業(yè)Bean持久性機制決定了你是否要為處理數據庫連接編寫(xiě)代碼。不是采用CMP的企業(yè)Bean都必須自己編寫(xiě)連接處理的代碼,包括BMP實(shí)體Bean和會(huì )話(huà)Bean。對于CMP實(shí)體Bean,deploytool工具會(huì )自動(dòng)產(chǎn)生連接處理的代碼。
獲得連接
如何獲得連接
以SaingsAccountBean為例:
1. 確定數據庫名:
private String dbName =
"java:comp/env/jdbc/SavingsAccountDB";
2. 獲得數據庫連接工廠(chǎng):
I(yíng)nitialContext ic = new InitialContext();
DataSource ds = (DataSource) ic.lookup(dbName);
3. 從工廠(chǎng)獲得連接:
Connection con = ds.getConnection();
獲得連接的時(shí)機
編寫(xiě)企業(yè)Bean時(shí),你需要決定連接保持的時(shí)間。通常有兩種選擇:持續連接,在企業(yè)Bean的生命周期中一直保持連接或者在每一個(gè)數據庫操作期間保持連接。臨時(shí)連接,僅在每一個(gè)數據操作期間保持連接。這兩種連接方式將決定數據操作方法的實(shí)現。
持續連接
你可以設計一個(gè)企業(yè)Bean,在它的整個(gè)生命周期中保持數據庫連接。因為它連接數據庫和斷開(kāi)數據庫連接都只進(jìn)行一次,所以它的方法得到連接都很簡(jiǎn)單。但是它有一個(gè)缺點(diǎn):其他組件在該Bean的生命周期內就不能使用該連接(它獨占了一個(gè)連接資源)。會(huì )話(huà)Bean和實(shí)體Bean在不同的方法中獲得持續連接。
會(huì )話(huà)Bean
EJB容器在會(huì )話(huà)Bean生命周期開(kāi)始的時(shí)候調用ejbCreate方法在結束的時(shí)候調用ejbRemove方法。所以會(huì )話(huà)Bean的持續連接在ejbCreate方法中獲得,并在ejbRemove方法中斷開(kāi)。如果是有狀態(tài)會(huì )話(huà)Bean你也必須在ejbActive中取得連接并在ejbPassivate中斷開(kāi)連接。有狀態(tài)會(huì )話(huà)Bean之所以需要這些額外的連接和斷開(kāi)動(dòng)作,是因為EJB容器在它的生命周期內可能會(huì )鈍化它。在鈍化期間,該有狀態(tài)會(huì )話(huà)Bean被保存在二級存儲器(硬盤(pán))中,但是數據庫連接不能保存在這里。而無(wú)狀態(tài)會(huì )話(huà)Bean不會(huì )被鈍化,所以它不需要在ejbActive和ejbPassivate方法中獲得和斷開(kāi)數據庫連接。關(guān)于激活和鈍化的更多信息請參考有狀態(tài)會(huì )話(huà)Bean的生命周期(第3章第8節)。在j2eetutorial/examples/ejb/teller目錄下的TellerBean.java是使用持續連接的有狀態(tài)會(huì )話(huà)Bean的例子。
BMP實(shí)體Bean
當實(shí)例化一個(gè)實(shí)體Bean并把它放入Bean池中的時(shí)候EJB容器調用setEntityContext方法。相對地,在當實(shí)體Bean從Bean池中被移除并成為垃圾收集器的目標時(shí)EJB容器調用unsetEntityContext方法。所以BMP實(shí)體Bean的持續連接在setEntityContext方法中獲得并在unsetEntityContext方法中斷開(kāi)。實(shí)體Bean的生命周期參考圖3-5(第3章第8節)。在j2eetutorial/examples/ejb/savingsaccount目錄下的SavingsAccountBean.java是使用持續連接的實(shí)體Bean的例子。
臨時(shí)連接
只在使用時(shí)暫時(shí)占有連接可以使許多組件共用同一個(gè)資源連接。因為EJB容器管理一個(gè)數據庫連接池,企業(yè)Bean可以快速地獲得和釋放連接。例如,一個(gè)商業(yè)方法可以得到連接,插入一行數據,然后釋放連接。在會(huì )話(huà)Bean中,商業(yè)方法連接數據庫會(huì )啟動(dòng)一個(gè)事務(wù)以保證數據完整性。
用deploytool指定數據庫用戶(hù)名和密碼
下面的方法不適合CMP實(shí)體Bean,關(guān)于CMP實(shí)體Bean的數據庫連接方法請參考第6章CMP例子中的相關(guān)內容。這種Claudscape數據庫連接不需要指定用戶(hù)名和密碼,因為權限驗證已被分開(kāi)成為另一項服務(wù)。更多信息請參考第15章。
然而,很多其它類(lèi)型的數據庫系統卻需要提供用戶(hù)名和密碼來(lái)獲得連接。對于這些數據庫系統如果調用無(wú)參數的getConnection方法,那么必須在deploytool中指定數據庫的用戶(hù)名和密碼:
1.在樹(shù)視圖中選中企業(yè)Bean節點(diǎn)
2.選擇Resource Refs頁(yè)簽
3.在Resource Factories Referenced in Code表格中選擇對應的行,然后在頁(yè)簽下面的輸入框中分別輸入數據庫的用戶(hù)名和密碼。
如果你想在程序中指定用戶(hù)名和密碼,就不需要deploytool來(lái)指定了,只是在或的數據庫連接的時(shí)候要用它們作為getConnection方法的參數:
con = dataSource.getConnection(dbUser, dbPassword);
連接池
EJB容器管理數據庫連接池,連接池對企業(yè)Bean是透明的。當企業(yè)Bean請求一個(gè)連 接時(shí),容器從連接池中取出一個(gè)連接給企業(yè)Bean。因為連接早就建立好了,所以企業(yè)Bean可以更快的得到一個(gè)連接。因為企業(yè)Bean這樣可以快速得到連接,所以可以在每次數據庫操作結束后就馬上釋放連接。企業(yè)Bean占用一個(gè)連接只是很短的時(shí)間,因而同樣的連接可以被很多的企業(yè)Bean使用。
聯(lián)系客服