欢迎来讨论一下EJB的设计实现方法!(300分)

  • 主题发起人 主题发起人 kindly
  • 开始时间 开始时间
K

kindly

Unregistered / Unconfirmed
GUEST, unregistred user!
最近公司在做一个EJB的项目,刚刚接触,不懂的地方很多,我目前的设计方法就是把每个表
映射为一个CMP实体类,有些几张表才能表现的对象用一个session bean来模拟,类似于视图,
业务逻辑用一些session bean来实现,jsp调用session bean的接口,不知道我的方法是否符合
EJB的规范,我感觉总有些不妥,有做过的朋友欢迎发表一下看法。
 
这样的效率太低了,我有血的教训。
http://www.delphibbs.com/delphibbs/dispq.asp?lid=673665
看看吧,对你或许有帮助。
 
随便说几句(不对任何人负责哟)
首先确定项目是否真正需要EJB(不要为了OO而OO,为了EJB而EJB)。
对于规模小,业务量不大,但对效率有较高要求,应该考虑 JSP + Beans;
对于项目规模较大,业务扩展变化频繁,对系统灵活性要求较高,此时可以考虑 EJB。
BMP 和 CMP的选择
二者的选择不能太绝对。个人认为,对于频繁查询、数据更新操作较少的TABLE可以直接影射成
CMP。
大多数情况,还是用BMP实现,为自己提供更多的优化空间,同时对于复杂查询,
可以考虑EJB20支持的Homy Method.当然大量使用BMP EJB,降低了Entity Bean的可维护性,同时要求
开发人员对Entity Bean要有较深理解(千万留意ejbLoad、ejbStore),以做到更好的优化。
结果数据的封装传送
对于ResultSet,可以考虑使用CachedRowSet,而不要自己使用Vector来封装。
对于一般EJB(主要是指SESSION BEAN)的结果集的返回,我觉得ArrayList/Vector效率不错。
EJB客户端
对Lookup定位Home的重复操作是一个很大的消耗,在次可以考虑实现一个EJB Home Factory,使定位home的代码抽象化,提高其
在应用生命周期中的可重用性。
累了。。。


 
下面两本书是设计ejb的权威著作,值得参考:
http://www.theserverside.com/books/masteringEJB/download/MasteringEJB2.pdf
http://www.theserverside.com/resources/patterns_review.jsp
记得给我分呀:)
 
刚才打了一大段,提交失败了,气死我了~~~
to zhuny:
thanks for ur suggestion,we are now on designing period,there's always a
problem in my mind:what the session bean realydo
es? people will tell me:
for business logi,but i can't tell the difference between java beans and session
beans,except for session beans runs on an application server. how to design a
good session bean is my problem,can you give me some suggestion? or some bean
interface.
to vrgl
heard ur name for a long time[:)],i am reading the books you suggested me.
but i still want your suggestions.if 300 is not enough,i will new a thread.
 
> 有些几张表才能表现的对象用一个session bean来模拟,类似于视图
??
哪儿有这样的说法?
如果你觉得cmp不爽的话,可以用bmp来实现呀。多张表也可以用一个entitybean来表示的。
不过在更新的时候麻烦一些。
而且我觉得如果对ejb不够了解,就不要用ejb来做项目。会死的很惨的。
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=673665
 
sonymusic:
我同意你的观点,会死的很惨的,但是不是我要做啊,领导认为EJB不错,可以做,就要做,
我没有办法啊。
多张表用一个entity bean来实现和用一个session bean来实现本质上我感觉没有什么不同,
能指导一下我吗?这样的话,entity bean和session bean的本质区别到底是什么呢?请指教。
谢谢!
 
无状态session bean的性能要比entity bean的性能
高得多,m$的.net为了提高性能都没有与entity bean
对应的东西,按m$的说法:“entity bean实在是垃圾。”
所以最好不要远程存取entity bean,而用个session
facade。
 
我倒宁可sun和m$能够不要试图通过模式来逃避这个问题。其实直接操作entitybean是最直接
的方法,也是最让人明白的方法。
唉,在调用entitybean还需要这么多技巧的时候,我是不会使用ejb的了。太麻烦了。
等2.1或3.0吧。呵呵。
 
》》the difference between java beans and session beans,except for session beans runs on an application server
Bean 和EJB的不同 简单的说主要体现在如下方面:
EJB是一种分布式对象系统的组件架构 ,构建可扩展、可延伸系统的框架.
支持事务处理: 多个业务操作同时成功,或全部失败 可以通过在代码外的描述来定义事务处理级别
可扩展性: EJB 可以根据您应用的增长而扩展
EJB 服务器往往还提供了负载均衡和安全性:由 EJB 服务器提供资源的访问权限控制
俺觉得仅仅因为不了解EJB,而不用EJB,实在可惜。。。

对于多表的影射,用SESSION和ENTITY都可能有好的实现 ,至于性能也很难说清。但从体系结构来说,
用BMP来影射,更符合J2EE规范,更能体现业务逻辑与数据的分离。SESSION BEAN相对来说短暂存在的,
代表单个用户来执行, ENTITY BEAN是持续的长期的,允许多用户共享访问。
 
啃了一通书,现在我稍微有点概念了,中间层的设计,我没有做过,我很想知道一个良好的
中间层类设计应该包括那些接口,那位朋友可以举个EJB的类的接口声明例子给我看看?
 
来自sun的j2ee教程的例子,这是一个session bean的接口。
The remote interface, which extends javax.ejb.EJBObject, defines the business
methods that a remote client may invoke. Here is the source code for the Cart
remote interface:
代码:
import java.util.*;	
import javax.ejb.EJBObject;	
import java.rmi.RemoteException;	
	
public interface Cart extends EJBObject {	
 	
   public void addBook(String title) throws RemoteException;	
   public void removeBook(String title) throws 	
                     BookException, RemoteException;	
   public Vector getContents() throws RemoteException;	
}
The method definitions in a remote interface must follow these rules:
Each method in the remote interface must match a method implemented
in the enterprise bean class.

The signatures of the methods in the remote interface must be identical
to the signatures of the corresponding methods in the enterprise bean class.
The arguments and return values must be valid RMI types.
The throws clause must include the java.rmi.RemoteException.
 
这个例子我也看过了,很容易懂,但是对于一个系统来说,情况往往复杂的多,是不是什么
操作都要放到EJB里面去做呢?
举个简单的例子来说,jsp端需要一个表中的某个字段的集合
作为一个DropDownBox的Items,类似于Delphi中的LookUp吧,是在EJB中写一个finder呢,还是
用一个java bean 来直接写一条select?或是干脆就在jsp里写?这种需求可能还有很多。对于
一个entity bean来说,我不知道那些字段我可能回需要查找,难道为每个字段写一个finder?
很多时候我觉的直接写sql好的多,可这样是否就不是OO呢?
 
毫无疑问,把sql直接写到jsp中是一种愚蠢的做法,绝对不要这样做,否则在后期的系统
维护中你会吃尽苦头的!
我给你的例子只是一个sessionbean的接口,而这和entitybean是不同的。
请注意:sessionbean专注的是业务,而不是数据库。而entitybean则是专管数据库的。
一般来说,不要在sessionbean中直接访问数据库,在entitybean中也无须考虑太多的业务
逻辑。
至于finder方法,对于常用的(如查某一个topic下的所有message)可以专门写finder方法,
而对于一些所谓的模糊查找,可以写一个通用的查询方法。如何写,传什么参数,由你自己
来定。比如可以传递where子句,或者自己构造一个过滤器,在finder方法中重新还原构造
成sql语句。

一般来说,各个层次进行的操作:
以本bbs操作为例,进行list,post
entitybean:只需要处理如topic,message等表的insert, update, select操作,至于流通的
数据是干什么的,则无须关心。
sessionbean:它的任务是处理业务,考虑这样两个方法
ForumSession.post(String title, String body, User createdUser)
ForumSession.reply(long topicID, String body, User createdUser)
分别用于完成post和reply的操作,在方法内部,访问对应于topic和message表的entitybean,
在这里可能会根据需要(有一些固定的业务规则)对一些数据进行判断,取舍。
当然,我给出的这两个方法的声明只是一个很简单的例子,你可以根据自己的情况进行扩充。
甚至再构造一些公用的Message, Topic的helper类。
在servlet中,负责将表单中来的数据分析,转换,过滤,并调用sessionbean中的方法来
完成操作,再构造一些类(这时就可以用到上面说到一些Helper类啦),以供jsp显示之用。
jsp中嘛,当然是做显示用的啦。
这其实就是典型的MVC模式。当然如果你不希望这么讲究的话,也可以将servlet和jsp合并,
事实上很多使用jsp的人都是这么干的。包括我以前的项目,我似乎并不喜欢使用servlet。
但是经验也告诉我,尽可能的将java代码从jsp中分离出来是一个很好的主意,对程序的可
维护性非常有帮助。
就说这么多了,希望你明白。:P
 
to sonymusic:
谢谢你热心的帮助,我完全明白你的意思。因为我原来就有类似于这样的模模糊糊的概念,
现在比较清楚了,您对我的帮助很大,谢谢了。
 
问题没有结束,各位朋友有什么好的建议和意见,欢迎继续讨论。如果三天没有新帖子,我就
揭帖发分了。
 
后退
顶部