EJB 組件的一個(gè)比較常見(jiàn)的用途是在關(guān)系型數(shù)據(jù)治理領(lǐng)域。與 RMI 結(jié)合起來(lái),EJB 組件讓您不必鉆研 JDBC 就可以從關(guān)系數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)數(shù)據(jù)。但這種抽象是要付出代價(jià)的:RMI 很慢,通常是極慢。那么,竅門(mén)就是找到一種方法來(lái)保持 EJB 技術(shù)的所有優(yōu)點(diǎn)而又沒(méi)有使用 RMI 的巨大開(kāi)銷(xiāo)。在這篇技巧文章中,您將看到值對(duì)象(也稱(chēng)為對(duì)象映射)是如何幫助您繞開(kāi)最嚴(yán)重的 RMI 速度障礙的。您將首先從一個(gè)工作示例開(kāi)始,然后了解代碼是怎樣工作的。
簡(jiǎn)單實(shí)體 bean
考慮一個(gè)名為 DVDs 的簡(jiǎn)單數(shù)據(jù)庫(kù)表。這個(gè)表有幾列:id、title、releaseDate、PRodUCer(通過(guò)外鍵)和 Director(也是通過(guò)外鍵)。因?yàn)槲覀冋谑褂?EJB 組件,所以表由實(shí)體 bean 表示,并且每個(gè)列都有其自己的取值(accessor)方法和賦值(mutator)方法。清單 1 顯示了我們的 DVD 表的遠(yuǎn)程接口:
清單 1. DVD 遠(yuǎn)程接口
import com.ibm.ejb;
import java.rmi.RemoteException;
import java.util.Date;
import javax.ejb.EJBObject;
public interface DVD extends EJBObject {
public int getId() throws RemoteException;
public String getTitle() throws RemoteException;
public void setTitle(String title) throws RemoteException;
public Date getReleaseDate() throws RemoteException;
public void setReleaseDate(Date releaseDate) throws RemoteException;
public Person getProducer() throws RemoteException;
public void setProducer(Person producer) throws RemoteException;
public Person getDirector() throws RemoteException;
public void setDirector(Person director) throws RemoteException;
}
這里的問(wèn)題是如何訪(fǎng)問(wèn)表數(shù)據(jù),可能一次訪(fǎng)問(wèn)所有數(shù)據(jù)。為進(jìn)行一次 DVD 銷(xiāo)售或搜索,在線(xiàn)商店或清單應(yīng)用程序很可能要求獲取上述列中包含的大多數(shù)或所有信息。為了訪(fǎng)問(wèn)所有信息,應(yīng)用程序?yàn)槊苛姓{(diào)用一個(gè)取值方法 ? 共有五次方法調(diào)用,每次都會(huì)多占用一點(diǎn) RMI 通信時(shí)間。這種情況再加上其它復(fù)雜性,如可能的錯(cuò)誤情況、網(wǎng)絡(luò)流量和相關(guān)問(wèn)題,以及數(shù)據(jù)的指數(shù)級(jí)數(shù)量(大多數(shù)此類(lèi)表有 15 行或更多),我們的應(yīng)用程序隨時(shí)都可能崩潰。
這時(shí)就需要值對(duì)象。值對(duì)象是簡(jiǎn)單的 Java 類(lèi),可以用它來(lái)表示多種對(duì)象,包括關(guān)系數(shù)據(jù)庫(kù)行中的數(shù)據(jù)。通過(guò)直接使用值對(duì)象,而不是反復(fù)使用 bean 的遠(yuǎn)程接口,我們可以將 RMI 通信減少到一次方法調(diào)用。
創(chuàng)建值對(duì)象
清單 2 中的值對(duì)象看起來(lái)和我們的遠(yuǎn)程接口幾乎相同,但它實(shí)際上是具體類(lèi)。注:通常用 bean 的名稱(chēng)加上 Info 來(lái)表示值對(duì)象。
清單 2. DVD 值對(duì)象
package com.ibm.ejb;
import java.io.Serializable;
import java.util.Date;
public class DVDInfo implements Serializable {
private int id;
private String title
private Date releaseDate;
private Producer producer;
private Director director;
public int getId() {return id;
}
void setId(int id) {this.id = id;
}public String getTitle() {return title;
}
public void setTitle(String title) {this.title = title;
}
public Date getReleaseDate() {return releaseDate;
}
public void setReleaseDate(Date releaseDate) {
this.releaseDate = releaseDate;
}
public Person getProducer() {
return producer;
}
public void setProducer(Person producer) {this.producer = producer;
}
public Person getDirector() {return director;
}
public void setDirector(Person director) {this.director = director;
}}
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注