EJB中三種Bean的總結

[color=blue][b]會話bean(session bean):[/b][/color]負責與客戶端交互,是編寫業務邏輯的地方,在會話bean中可以通過jdbc直接操作數據庫,但大多數情況下都是通過實體bean來完成對數據庫的操作。
會話bean分爲兩種:
[b]無狀態會話bean (Stateful Session Bean)[/b]:平常我們使用最多的是無狀態bean,因爲它的bean實例可供多個用戶使用,所以它的性能比有狀態bean高。正因爲一個bean實例被多個用戶使用,那麼前一個用戶設置的值有可能被後一個用戶所修改,所以它無法正確保存某個用戶設置的值,因此是無狀態的。
當客戶機和服務器建立連接之後,無狀態會話bean處理單一的用戶請求或商務過程。無狀態會話bean不需要從以前的請求中提取任何狀態。例如,用戶的用戶密碼確認。用戶輸入密碼後,發送請求。組件返回真或假來確認用戶,一旦過程完成,無狀態會話bean也宣告結束。
如:
import javax.ejb.Remote;
import javax.ejb.Stateless;
import com.mixele.ejb3.HelloWorld;
@Stateless //該註解指明這個程序是個無狀態的會話Bean
@Remote(HelloWorld.class)
public class HelloWorldBean implements HelloWorld {
@Override
public String sayHello(String name) {
return name + "Say: Hello,World!";
}
}


[b]有狀態會話bean (Stateless Session Bean)[/b]:有狀態bean平常使用的並不多,因爲它的一個bean實例只供一個用戶使用,所以性能開銷比較大,正因爲它的實例只被一個用戶使用,用戶爲它設置的值是不會被其他用戶修改,所以可以正確保存用戶設置的值,因此是有狀態的。
當客戶機和服務器建立連接之後,狀態會話bean將一直在客戶機和服務器之間保持着用戶的某個狀態。例如:用戶使用銀行的ATM時,經過驗證之後,用戶可以連續執行多次操作,在這個過程當中,用戶的合法狀態將一直被保留,直到她將信用卡取出,結束這次操作。這時,狀態會話bean也就被銷燬。
@Stateful //該註解指明這個程序是個有狀態的會話Bean
@Remote(HelloWorld.class)
@Local(HelloWorldLocal.class)
public class HelloWorldBeanStateful implements HelloWorld, HelloWorldLocal {
public String sayHello(String name) {
return name + " Say: Hello,World! -- in HelloWorldBeanStateful";
}
}

有狀態Bean只是在類的註解上使用了:@Stateful
在代碼上有狀態Bean和無狀態Bean區別不大,但是卻是用了Bean實例的兩種管理技術,即:
1. 無狀態bean使用實例池技術管理bean。
2. 有狀態bean使用激活(activation)管理bean。

每個用戶都有自己的Bean實例,相當於有多少個用戶就有多少個Bean實例爲之服務。如果不採取任何機制,這樣必然會導致服務器資源嚴重消耗,最後落個down機。爲了解決這個問題,EJB引入了激活機制。激活機制實現的原理是這樣的,在EJB服務器需要節省資源時,就從內存中收回bean實例,將其所保持的會話狀態序列化到硬盤中,並且釋放其所佔有的內存,這個過程爲鈍化。若此時客戶端對EJB再次發起請求,EJB容器會重新實例化一個Bean實例,並從硬盤中將之前的狀態恢復。


[color=blue][b]實體bean(entity bean):[/b][/color]它實際上屬於java持久化規範(簡稱JPA)裏的技術,JPA的出現主要是爲了簡化現有的持久化開發工作和整合ORM技術,結束現在Hibernate、TopLink等ORM框架各自爲營的局面。
實體bean用來表示持久存儲庫裏的一個東西。這通常就是指數據庫裏的一個東西,實體bean的一個實例就表示數據庫表中的一行(不過,如果數據庫得到了規範化,bean也有可能從多個表的數據行提取信息,也就是說,可能對應到多個表中的多個數據行)。實體bean的一個典型例子就是Customer(顧客),一個Customer實體bean可能表示Bo Olean,另一個Customer實體bean可能表示的是Trixia Lin。
實體bean只是數據模型,它不包括商務邏輯。實體bean可以將關係/對象數據庫的數據映射到內存中供其它組件使用。實體bean是一直存在的,而且具有很高的容錯性能。實體bean能供允許多用戶同時訪問。
如:
@Entity //標註該Bean爲實體Bean
@Table(name="person") //標註該Bean與數據庫的person表進行映射
public class Person implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private String name;

@Id //標註id屬性是數據庫表的主鍵,這個註解時實體Bean必須的
@Column(name="id") //標註id屬性與數據庫表的id字段進行映射
@GeneratedValue(strategy=GenerationType.AUTO) //指定主鍵生成策略
public Integer getId() { return id; }
public void setId(Integer id) { this.id = id; }
@Column(name="name",length=20,nullable=false)
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int hashCode() { ………… }
public boolean equals(Object obj) { ………… }
}



[color=blue][b]消息驅動bean(message-driven bean):[/b][/color]它是專門用於異步處理java消息的組件,具有處理大量併發消息的能力。只有在需要一個JMS客戶的時候纔會實用消息驅動bean。換句話說,消息驅動bean可以監聽來自JMS消息服務的消息。客戶絕對不會直接調用消息驅動bean;要想讓消息驅動做點什麼事情,客戶必須向一個消息服務發出一條消息。這說明,消息驅動bean沒有相應的EJBObject,因爲服務器會從消息服務直接得到客戶請求,而不是當客戶向bean發出調用時截獲客戶請求。NewCustomerNotification訂購者就是一個典型的消息驅動bean。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章