有狀態EJB和無狀態EJB的區別

        前邊的文章中,簡單的介紹了ejb的三種bean,我們這片文章通過實例來看一下有狀態的會話bean和無狀態的會話bean的區別。

         我們建立一個ejb項目,分別創建兩個接口, 兩個實現類,每個類中都有相同的方法,並在每個類中有一個靜態變量,用來存放數據。代碼如下所示。至於如何發佈ejb項目到JBoss中,請參見Ejb框架搭建

         

/**
 * 有狀態sessionbean的接口
 * @author hongjie
 *
 */
public interface EjbStatefulSession {
	public String Count();
}
/**
 * 無狀態bean的sessionbean的接口
 * @author hongjie
 *
 */
public interface EjbStatelessSession {
	public String Count();
}
/**
 * 有狀態bean的實現類
 * @author hongjie
 *
 */
@Remote
@Stateful
public class EjbStatefulSessionBean implements EjbStatefulSession {
	//靜態變量,用來存放數據,看兩次調用返回的數據是否是同一份數據
	private  Integer i=0;
	//每次返回的數據+1
	@Override
	public String Count() {
		i=i+1;
		return i.toString();
	}
}
/**
 * 無狀態bean的實現類
 * @author hongjie
 *
 */
@Remote
@Stateless
public class EjbStatelessSessionBean implements EjbStatelessSession {
	//靜態變量,用來存放數據,看兩次調用返回的數據是否是同一份數據
	private  Integer i=0;
	//每次返回的數據+1
	@Override
	public String Count() {
		i=i+1;
		return i.toString();
	}
}


         我們在創建一個客戶端,在客戶端的Main方法中,我們要創建四個上下文對象,其中兩個上下文對象創建有狀態EJB,另外兩個上下文對象創建無狀態EJB對象,這四個EJB對象分別調用Count方法。

 

package com.tgb.ejb.client;

import java.util.Properties;

import javax.naming.InitialContext;
import javax.naming.NamingException;

import junit.framework.TestCase;

import com.tgb.ejb.EjbStatefulSession;
import com.tgb.ejb.EjbStatelessSession;

public class EjbSessionBeanClient extends TestCase   {

	public static void main(String[] args) {
		//jndi所用的url
		Properties props = new Properties();
		props.setProperty("java.naming.factory.initial",
				"org.jnp.interfaces.NamingContextFactory");
		props.setProperty("java.naming.provider.url", "localhost:1099");
		
		 try {
			//上下文ctx0
			InitialContext ctx0 = new InitialContext(props);
			//有狀態EJB對象
			EjbStatefulSession statefulSession = (EjbStatefulSession) ctx0
					.lookup("EjbStatefulSessionBean/remote");

			for (int i = 0; i < 5; i++) {

					System.out.println("有狀態bean第一次調用"+statefulSession.Count());
			}
			//上下文ctx1
			InitialContext ctx1 = new InitialContext(props);
			//有狀態EJB對象
			EjbStatefulSession statefulSession1 = (EjbStatefulSession) ctx1
					.lookup("EjbStatefulSessionBean/remote");

			for (int i = 5; i < 10; i++) {

				System.out.println("有狀態bean第二次調用"+statefulSession1.Count());
			}
		} catch (Exception e) {
			System.out.println(e.toString());
		}
		 
		try {
			//上下文ctx2
			InitialContext ctx2 = new InitialContext(props);
			for (int i = 0; i < 5; i++) {
				//無狀態EJB對象
				EjbStatelessSession statelessSession2 = (EjbStatelessSession) ctx2
						.lookup("EjbStatelessSessionBean/remote");
				System.out.println("無狀態bean第一次調用"+statelessSession2.Count());
			}

		} catch (Exception e) {
			System.out.println(e.toString());
		}
		//上下文ctx3
		InitialContext ctx3;
		try {
			ctx3 = new InitialContext(props);
			for (int i = 0; i < 5; i++) {
				//無狀態EJB對象
				EjbStatelessSession statelessSession3 = (EjbStatelessSession) ctx3
						.lookup("EjbStatelessSessionBean/remote");
				System.out.println("無狀態bean第二一次調用"+statelessSession3.Count());
			}
		} catch (NamingException e) {
			e.printStackTrace();
		}	
	}
	
}

         我們可以看到輸出值如下,有狀態EJB對象,每次調用都是從1到5,說明我們每次調用有狀態EJB對象,EJB容器都會爲我們提供一個新的EJB對象。而無狀態EJB對象,每次調用都是從上一次增加1 ,說明我們一直用的是一個EJB對象。所以如果我們不需要保存用戶數據的話,那麼我們就是用無狀態EJB對象,無狀態EJB對象是採用的是實例池技術管理的EJB對象,而有狀態的EJB對象是激活管理方式進行管理的!

         EJB對象的訪問方式還有本地和遠程之分,在本地訪問方式中,不通過socket協議,在同一個jvm中進行通訊,而遠程訪問方式要通過socket協議,產生網絡連接,所以速度會比本地方式慢。但是在實際中本地訪問方式還不是很長用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章