bang,请教一下ejb框架和spring.

ejb确实提供了一个容易开发的分布式架构,也是因为它是分布架构决定它有着很好的可伸缩性。据个人对ejb和spring的理解,这也是它仅有的优势,对比spring等轻量级容器。但对于很大一部分的应用,可伸缩性完全可以通过对整个基于spring的应用程序来cluster实现,起码对于我来说没碰到过需要对一个应用的各个部分进行分布部署来实现伸缩性。而ejb的开发确实有很多烦人的事情,主要是因为它和容器绑定的太死了。且不说它的可测试性,oo设计方面等的限制(最近看了一个ejb3.0的faq,ejb3。0也是朝这个方向发展,而这些spring基本上现在都已经实现了),就说一个典型的问题,我最近在整以前的一套ejb程序(web通过remote接口调用的方式),发现对于一些web端和ejb端都统一的应用系统常量管理的很混乱。一般通过通过一张数据库表(我们叫标准代码表)来集中存储这些应用系统的常量。对于纯web系统可以在系统启动的时候把这些数据cache起来。但这些系统常量对于web和ejb端都是需要的,那在ejb端该如何有效的cache这些数据呢?通过entity bean的cache机制,或则通过jndi来存储,如果系统要分布部署,那么各个应用模块就需要通过remote调用这些cache起来的数据,或则在每个模块都部署一个同样的数据来实现。不知道bang有什么好办法对于这个问题?谢谢

我现在先用jndi来存储这些信息。但不能避免每次通过jndi查找开销

用支持cluster的cache工具,例如oscache,他可以使用jms来做cache之间的同步。

>那在ejb端该如何有效的cache这些数据呢?
通过无状态Bean的ejbCreate构造EJB类变量来Cache这些数据。

其实,使用EJB最大的瓶颈是:编制程序时,需要以多台分布式思维来想像程序,但是也不能每个EJB都remote,建议程序员编制时全部local,然后,由cluster设计师来调整remote和cluster。

>>由cluster设计师来调整remote和cluster
能不能具体说一下呢?
按个人理解,remote和local调用的方式在编码上有比较大的不同,我还想不出有效的办法来用最小的编码量来进行方便的remote和local之间的切换。我原来做的是同一个模块之间是local,不同模块之间是remote,不同层(web,ejb)之间也是remote。发布的时候如果想实现local的方式,就打包在一起,然后利用服务器的optismistic 特性(比如weblogic提供call-by-reference)来避免remote的开销。
不知道bang有没有更好的办法?谢谢

> >那在ejb端该如何有效的cache这些数据呢?
> 通过无状态Bean的ejbCreate构造EJB类变量来Cache这些数据?
>
>
> 其实,使用EJB最大的瓶颈是:编制程序时,需要以多台分布?
> 思维来想像程序,但是也不能每个EJB都remote,建议程序员?
> 制时全部local,然后,由cluster设计师来调整remote和clus
> er。

这方面还想请banq多指点一二:在cluster设计师着手调整之前,也就是说,在程序员编写业务逻辑之时,应该采取何种设计方略?在我看来,系统设计有两种显而易见的不同策略,其一,面向对象的设计,各组件之间(通过接口)密切合作,通过大量的委派(delegate)使逻辑和数据各归其所,因此代码中常常会见到“otherObject.doSomething(this)”这样的委派代码;其二,面向服务的设计,各组件之间通过RPC构成松散的协作,每个组件实际上是一个facade,其内部采用Transaction Script模式实现,并且传递的是纯数据的DTO。如果说编制session bean时,程序员无须顾虑这个session bean将作为remote使用还是local使用,请问他应该采取哪种设计思路呢?

remote和local和区别基本有两个:

1. JNDI调用方式,这个可以使用Service Locator来封装,通过配置文件来指定是否remote。

2. ejb-jar.xml。这个配置文件改变也很容易,另外,cluster时,不同J2EE容器有不同的配置文件,配置调整策略是根据具体系统的集群策略来制定的,一般是将访问量大的那几个session做集群就能取得好的效果。

> remote和local和区别基本有两个:
>
> 1. JNDI调用方式,这个可以使用Service
> Locator来封装,通过配置文件来指定是否remote。
>
> 2.
> ejb-jar.xml。这个配置文件改变也很容易,另外,cluster时
> 煌J2EE容器有不同的配置文件,配置调整策略是根据具体?
> 统的集群策略来制定的,一般是将访问量大的那几个session?
> 集群就能取得好的效果。

也许我没有表达清楚。譬如说《重构》第一章的例子。现在我们有三个对象:Customer(顾客)、Rental(租借行为)、Movie(影片),Customer要租几部片子来看,算帐的时候就从Rental那里知道价钱:

Rental rental;
// rental包含了几部片子、租几天
double charge = rental.getCharge();

每张片子有不同的计费策略,比如新片收得贵点、连续剧便宜点,Rental又怎么知道如何算帐?于是它也不算,直接请求每部片子自己算,然后做个汇总:

public class Rental {
private int _days; //要租几天?
private List _movies; //要租哪些片子?
private int _level; //几星会员来租?
public double getCharge() {
累加 _movies.get(i).getCharge(this);

请注意最后一句:Movie.getCharge(Rental rental)方法。在计算一张影片的租金时,不仅要考虑影片本身的信息,还要考虑整个租借行为的所有信息。现在我请问了,像这样的一个设计,那位可敬的“cluster设计人员”打算怎么轻松地把Rental、Movie变成远程接口的对象?