其实应用服务器就是用这样的机制处理多client访问ejb的。你不用自己创建连接池。
解决方案 »
- java 文件读取
- Javar,您会见死不救吗?
- 急:关于加载XML严重问题?
- xfire 中如何定义复杂类型
- JAVA 调用MYSQL 带返回值存储过程 Parameter index of 13 is out of range (1, 11)
- 那里有Together Edition for JBuilder X 和license下载(解决就给分
- 关于struts中radio的用法,高分相送!!!!!
- Tomcat提交后,中文总为乱码,请指教~~
- Oracle在不同操作系统下,JDBC驱动程序是不是一样?
- 用户登录权限验证404错误
- 经常见到J2EE和EJB被一同提起,不知他们是什么关系?
- [EJB]HelloWorldBean正确编译配置和执行,但"HelloWorld"却不见了
HomeHandle myHomeHandle = home.getHomeHandle();以后要用home的时候就
MyEJBHome home = myHomeHandle.getEJBHome();
这样可以减少jndi查找的时间消耗这个Handle应该是可以从网络中传输的,因为可以序列化,所以可以在多个机子上面共用这个HandleEJBObject也有Handle,不过保存这个Handle的情况好象很少见
关于lookup是比较费时间,但是客户端只要连接一次就可以了,那样只要你不关闭它就可以一直调用你所有的EJB,我想也不是不可以接受吧。
2)当前Home接口无效,重新Lookup
所以通过序列化传到别的客户端也应该可以使用因为Home接口本身是不能被序列化的,所以你无法将它通过网络传送出去,而且我认为J2EE平台,例如:jboss,weblogic,对于Home接口是应该有缓冲处理的,具体的实现应该就是通过HomeHandle,不然这个借口是干嘛用的,弄着好玩?我认为相对于保存Home接口,保存HomeHandle应该是一个更为合理的方法,同理EJBObject也有Handle接口,实现机制估计差不多,对于有状态的SessionBean,传递整个SessionBean应该是不妥当的,应该传递Handle吧不过上面都是我的猜测而已,呵呵,别打我,我这里条件有限,无法测试,等我去找jboss的源码看看具体的实现在说
建议参看一下《J2EE核心模式》一书中的 服务定位器。
public class ServiceLocator { private Map ejbHomes;
private static ServiceLocator aLocatorSingleton;
Context ctx; /**
* private constructor.
*/
private ServiceLocator() throws NamingException {
try {
ctx = new InitialContext();
this.ejbHomes = Collections.synchronizedMap(new HashMap());
}
catch(Exception e){}
}
/**
* »ñÈ¡Ò»¸öʵÀý(µ¥Ìå)
* */
public static ServiceLocator getInstance() throws PRPLocatorException {
try {
if ( ServiceLocator.aLocatorSingleton == null ) {
ServiceLocator.aLocatorSingleton = new ServiceLocator();
}
}
catch (NamingException e) {
throw new PRPLocatorException(e);
} return ServiceLocator.aLocatorSingleton;
}
/**
* ²éÕÒHome½Ó¿Ú£¬Èç¹ûÓÃhomeµÄÈ«°üÃû×÷ΪjndiÃû¡£
* @param homeClass Òª²éÕÒµÄÀà
* */
public EJBHome lookupHome(Class homeClass) throws PRPLocatorException {
EJBHome anEJBHome;
anEJBHome = (EJBHome) this.ejbHomes.get(homeClass);
try {
if(anEJBHome == null) {
anEJBHome = (EJBHome) PortableRemoteObject.narrow(ctx.lookup(homeClass.getName()), homeClass);
this.ejbHomes.put(homeClass, anEJBHome);
}
}
catch (ClassCastException e) {
throw new PRPLocatorException(e);
}
catch (NamingException e) {
throw new PRPLocatorException(e);
}
return anEJBHome;
} /**
* ²éÕÒHome½Ó¿Ú£¬ÌṩjndiÃû¡£
* @param homeClass Òª²éÕÒµÄÀà
* @param jndiName ´ËHomeµÄjndiÃû
* */
public EJBHome lookupHome(Class homeClass, String jndiName) throws PRPLocatorException { EJBHome anEJBHome;
anEJBHome = (EJBHome) this.ejbHomes.get(homeClass); try {
if(anEJBHome == null) {
anEJBHome = (EJBHome) PortableRemoteObject.narrow( ctx.lookup (jndiName), homeClass);
this.ejbHomes.put(homeClass, anEJBHome);
}
}
catch (ClassCastException e) {
throw new PRPLocatorException(e);
}
catch (NamingException e) {
throw new PRPLocatorException(e);
} return anEJBHome;
} /**
* ¸ù¾Ý¸ø³öµÄjndiÃû²éÕÒÊý¾ÝÔ´
* @param jndiÃû
* @return Êý¾ÝÔ´
* */
public DataSource lookupDataSource(String jndiName) throws PRPLocatorException {
try{
DataSource ds = (DataSource)ctx.lookup("java:/"+jndiName);
return ds;
}
catch(Exception ex){
throw new PRPLocatorException(ex);
}
} /**
* ¸ù¾Ý¸ø³öµÄ¶ÔÏóÐòÁкŻñÈ¡±£´æµÄEJB¶ÔÏó
* @param id ¶ÔÏóÐòÁкÅ×Ö´®
* @return È¡³öµÄEJB¶ÔÏó
* */
public static EJBObject getService(String id) throws PRPLocatorException {
if( id==null ) throw new PRPLocatorException("Null serialized string.");
try{
byte[] bytes = new String(id).getBytes();
ObjectInputStream os = new ObjectInputStream(new ByteArrayInputStream(bytes));
javax.ejb.Handle handle = (javax.ejb.Handle)os.readObject();
return handle.getEJBObject();
}
catch(Exception e){
throw new PRPLocatorException(e);
}
}
/**
* ±£´æEJB¶ÔÏó²¢»ñÈ¡±£´æµÄÐòÁкÅ
* @session Òª±£´æµÄEJB¶ÔÏó
* @return ±£´æ¶ÔÏóÐòÁÐ×Ö´®
* */
public static String getId(EJBObject session) throws PRPLocatorException {
try{
javax.ejb.Handle handle = session.getHandle();
ByteArrayOutputStream fo = new ByteArrayOutputStream();
ObjectOutputStream so = new ObjectOutputStream(fo);
so.writeObject(handle);
so.flush();
so.close();
return new String(fo.toByteArray());
}
catch(Exception e){
throw new PRPLocatorException(e);
}
}}
ejb的设计模式(楼上的《J2EE核心模式》)中就讲了有关ejb的几种模式。
ServiceLocator模式(楼上的就是讲的ServiceLocator模式)。
Session Facade模式
Page-by-Page Iterator模式
Value Object模式
CMR模式
Local模式
DAO模式
Fast-Lane-Reader模式
等等。以上模式在ejb设计模式中讲得很好。具体是怎么样的,请参考ejb设计模式(J2EE核心模式)。
希望和懂ejb设计模式的网友谈谈。
你贴出的代码我也看过,但我不是很理解我是奇怪,为什么不可以用类似数据库连接池这样的技术
来建立一个HOME的池呢?
最后再请教一下
这个EJBHOMEFACTORY模式我不是很理解
能简要的解释一下吗?谢谢!