《转》浅谈EJB
ejb一直是一个让我很纠结的技术,虽然ejb作为sun推荐的最佳实践,在sun的J2EE教程中,推荐jsp和servlet作为view层,ejb作为业务逻辑层。

上述就是J2EE教程讲J2EE体系中J2EE的EJB示意图了,讲了EJB的位置,详情可以看:http://docs.oracle.com/javaee/1.4/tutorial/doc/
然而我所接触使用ejb开发的程序员(都是国内),用了ejb,都没什么特别好感,甚至我以前的项目经理说,很多人被sun给欺骗了。
目前ejb已经出到了3.x了,然而国内已经几乎没有使用ejb3.x,有的也是ejb2.x,都是老系统遗留,有的是银行项目,有的是erp项目(都是大型项目)。
之前jboss出名就是因为它支持ejb,并且支持得最好,然而现在随着ejb的使用份额下降,这几年jboss在国内的使用份额也下降了,用tomcat和其他开源服务器多了很多。
我也很少用ejb,在开发中根本不用,除非是以前为了支持一些老系统,才会接触,而且为了应付ejb的,学了ejb3.0,但是遇到的项目全部是 ejb2.x,ejb3.0相比ejb2.0,简单了很多,不想ejb2.0那么繁琐,为了一个业务逻辑类,要写业务接口类,home类啥啥的,我觉得进 步很大,但是在国内依然没什么人使用。
这里就谈一下我对ejb的一些看法:
1.ejb是比较重量级:实现ejb是一件很复杂的事情,J2EE规范中ejb规范的实现是一块硬骨头,而ejb实在复杂,很多开发人员都喜欢简单的东西,复杂的东西,会带来未知风险。
2.ejb的移植性低:虽然ejb是遵循J2EE规范的,但是各个厂家在实现J2EE EJB的规范的同时,也会加入自己的一些实现,例如你要让一个EJB查找一个数据源,这个数据源如何配置,几乎所有的应用服务器厂商都不一 样,weblogic,websphere,jboss,apusic都有自己的一套实现方式。我每次想到移植ejb的应用,最怕是去找这些不同点,然后 一一修改相应配置。这无疑加大了开发人员的负担,java的东西,平台可移植性就是一大亮点。
3.ejb调用流程:ejb是支持远程调用,客户端值需要ejb的业务类接口,服务端值需要ejb的业务类实现,然后客户端只需要调用jndi(这 个规范实现很复杂,使用比较简单,还是很多人用)的lookup方法,就可以使用业务类接口直接调用服务端实现类的方法了,这中间,应用服务器做了很多处 理,基本流程都是:客户端通过jndi和业务类接口,调用对应ejb应用服务器厂商jndi的lookup服务端实现类方法,然后ejb应用服务器生成业 务类的存根和代理,存根从服务端序列化到客户端,客户端调用的ejb业务接口就是调用这个存根,然后这个存根又通过rmi协议或者iiop协议发送命令到 业务类的代理,代理再调用业务类实现,最终把执行结果返回到客户端。
3.ejb难以调试:看到ejb的调用流程,虽然看上去ejb让用户不用了解远程调用细节,使用简单,但是由于里面的调用过程复杂,一旦有一个环节 错了,用户都难以调试,排错,开发过程中出现问题不可避免,而解决ejb的问题,解决周期要比较久。出错的时候,错误信息也千奇百怪。
4.ejb的性能问题:ejb的调用涉及太多类的序列化和反序列化,本来通过网络传输已经很慢了,还要传递对象,数据量又更大了,还要涉及了对象的序列化和反序列化,这中间有太多的开销了。
5.ejb的替换开源产品太多了:现在业务逻辑,在java上要用框架的有spring,远程调用,有webservice(apache cxf已经做得很好了,而且webservice又是通用标准),mina(一个apache的NIO框架),netty(现在性能最快的NIO框架,来 自jboss).而且这些产品都是可移植,社区交流多,出了问题,google就找到了。
《转》浅谈EJB的更多相关文章
- 浅谈PHP代码设计结构
浅谈PHP代码设计结构 您的评价: 还行 收藏该经验 coding多年,各种代码日夜相伴,如何跟代码友好的相处,不光成为职业生涯的一种回应,也是编写者功力的直接显露. 如何看 ...
- 【转】浅谈.net remoting 与webservice
1. .NET Remoting .NET Remoting是微软随.NET推出的一种分布式应用解决方案,被誉为管理应用程序域之间的 RPC 的首选技,它允许不同应用程序域之间进行通信(这里的通信可以 ...
- 浅谈C++三层架构
浅谈C++三层架构 三层架构并不是MVC,MVC是一个很早就有的经典的程序设计模式,M-V-C分为三层,M(Model)-V(View)-C(Control). web开发中的三层架构是指:数据访问层 ...
- [转帖]浅谈IOC--说清楚IOC是什么
浅谈IOC--说清楚IOC是什么 Need Study https://www.cnblogs.com/DebugLZQ/archive/2013/06/05/3107957.html 博文目录 1. ...
- 浅谈 Fragment 生命周期
版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...
- 浅谈 LayoutInflater
浅谈 LayoutInflater 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/View 文中如有纰漏,欢迎大家留言指出. 在 Android 的 ...
- 浅谈Java的throw与throws
转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...
- 浅谈SQL注入风险 - 一个Login拿下Server
前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...
- 浅谈WebService的版本兼容性设计
在现在大型的项目或者软件开发中,一般都会有很多种终端, PC端比如Winform.WebForm,移动端,比如各种Native客户端(iOS, Android, WP),Html5等,我们要满足以上所 ...
随机推荐
- (4.7)sql server2008 中的merge
简介 Merge关键字是一个神奇的DML关键字.它在SQL Server 2008被引入,它能将Insert,Update,Delete简单的并为一句.MSDN对于Merge的解释非常的短小精悍:”根 ...
- redis实现队列queue
参考:<Redis入门指南>第4章进阶 http://book.51cto.com/art/201305/395461.htm 4.4.2 使用Redis实现任务队列 说到队列很自然就能想 ...
- Java并发(4):ThreadLocal
一.对ThreadLocal的理解 ThreadLocal是java.lang包中的一个类,很多地方叫做线程本地变量,也有些地方叫做线程本地存储,其实意思差不多.可能很多朋友都知道ThreadLoca ...
- reading list
Machine Learning1. Deep Learningimagenet classification with deep convolutional neural networks. 20 ...
- $python正则表达式系列(3)——正则内置属性
本文主要总结一下python正则的一些内置属性的用法. 1. 编译标志:flags 首先来看一下re.findall函数的函数原型: import re print('[Output]') print ...
- Ubuntu 16.04 安装Django
> pip install django==1.10.3......或者:> pip3 install django==1.10.3(我采用)......或者:>python3 -m ...
- Linux系统服务管理 系统服务
服务的分类 Linux 中的服务按照安装方法不同可以分为 RPM 包默认安装的服务和源码包安装的服务两大类.其中,RPM 包默认安装的服务又因为启动与自启动管理方法不同分为独立的服务和基于 xinet ...
- Java学习笔记之Java 继承中的构造方法
参考
- 【Flask】Flask上下文
# 上下文: ### Local对象:在`Flask`中,类似于`request`的对象,其实是绑定到了一个`werkzeug.local.Local`对象上.这样,即使是同一个对象,那么在多个线程中 ...
- Apache 虚拟主机配置
开放虚拟主机文件 修改主配置文件 解开注释,使用虚拟主机配置文件. vim /usr/local/apache2/conf/httpd.conf Include conf/extra/httpd-vh ...