J2EE的层次关系及并发控制

Presentaion tier--Bussiness Delegation--VO--Business tier

在Presentaion tier, JSP/Servlet有各种方法控制并发问题。
在Business tier, SessionBean, EntityBean也有各种方法控制并发问题.

请问

大家在考虑Bussiness Delegation和VO时,有什么好的建议控制并发?
正在思考...

能不能先说一下下面这些是怎样做的.
在Presentaion tier, JSP/Servlet有各种方法控制并发问题。
在Business tier, SessionBean, EntityBean也有各种方法控制并发问题.

在Presentaion tier, JSP/Servlet中, 我们可以用singlethread,也可以用synchronized整个函数或一小部分程序段,也可以通过Local variable或者把instance variable通过传参数的方式实现阶并发控制。

在Business tier, 我们有线程池的方式由EJB容器来解决,每一个SessionBean做为一个线程访问支持并发的EntityBean.

但是presentation tier 和 business tier之间的VO,也会涉及到并发问题,VO中的Setter和Getter,可能在多用户的时候出现同步问题。如何解决这样的问题呢?

我所能想到的办法如下:
1。把VO做成threadlocal的方式,使每个线程拥有一个VO, 但随着线程的增多,VO也增多,会影响效率。
2。把VO做成Singleton的模式,然后用synchrozide进行控制,这样可以解决上面问题1的问题,但多个线程共享一个VO, 当一个线程用Setter方法,其它的线程就不能使用Setter, 也会影响程序运行的效率。

另外,VO的弱点是:VO有可能不够Fresh,有脏读的可能。不知大家有什么好的想法?

抛块砖先。

好象有一种Double-checked locking pattern就是用来解决这个问题的

DCL可以用来解决Singleton的线程同步问题,但我说的是VO.

把VO做成singleton, 然后用DCL去处理

VO脏读用version number去解决

算了,我觉得还是每次在对VO操作的时候,先重新取一遍VO,因为如果有大量客户都在同时修改数据的时候,frequently check the version number is not good idea.虽然在其它情况下还是很好的办法,但实现比较麻烦 还是KISS吧, keep in simple,stupid.

不过不知道大家都是如何解决VO同步问题的,有好的意见,欢迎回贴。

比较清楚了,其实在Hibernate中,直接用PO代替VO不就得了,同步的问题留给Hibernate的session去处理,如:version check等,不过,如果系统中如果没有使用Hibernate的话,大家有何看法?

不知大家对Oracle的OC4J和BC4J做过研究没有,它对象的持久化提供了另外一种很类似JDO的实现,其中生成的代码可以由开发人员控制对象的不同级别的访问,比起CMP的O/R影射来方便了很多,看文档介绍效率也很高。用JDeveloper开发的集成度很好,好象用起来也很简单,呵呵,正在研究中……

――另外咨询一下各位大侠,有没有在SunONEAppServer7平台版上做商务应用的,因为免费,所以正在考虑Oracle的OC4J和SunONEAppServer7,给些建议?

那是TopLink,很有名气的一个商业ORM产品,2003年 JavaWorld Editor Choice中击败Hibernate的中选产品。

SunOne和Oracle的OC4J不是免费的,不要搞错了,只不过让你免费下载开发,商业运行要购买License。

呵呵,多谢指教。

我在WebGain公司还没被Oracle收购的时候就研究过TopLink,我一直对独立的建模和开发工具不是特别喜欢,O/R工具就象TopLink或Thought Inc.的Cocobase等,甚至包括JBuilder,这些工具虽说有强大完善的功能和广泛的用户人群,但针对某一平台未必最佳。

SunOneAppServer7平台实现还是不错的,其用SunONE Studio5的配合开发尤为完美。平台版的License好象除了不能做负载均衡和集群以及远程部署能力外,没什么限制。

补充一点,恕我浅陋,用TopLink从DB映射出来的Object和用BC4J开发出来的Java至少从代码上看完全没有相似的地方。BC4J映射出的Object应该就是Oracle的JDO实现。不知Robbin兄能否给详细解惑。

我也没有用过TopLink,我也没有用过OC4J和BC4J,我曾经简单的研究过OC4J,可能是我研究的太肤浅了吧,反正我觉得OC4J给我的感觉就是很烂,把Apache Tomcat的前身mod_jk拿过来改了改包装一下,再加上一大堆垃圾,就成了Oracle9iAS。

SunOne也没有研究过,Websphere用过,太臃肿了,而且不支持热发布,也非常不喜欢,Weblogic各个方面都是最优秀的,只不过搞不懂JRockit好像很慢,不像传说中那么好,JBoss没有用过,满世界都找不到文档下载,一个软件,如果没有文档就等于什么都没有,所以我从来不去学习JBoss。

robin,我可以不同意你对OC4J的看法,Oracle9i AS 确实比较烂,但是我觉得OC4J还是不错的,虽然看上去很简陋.事实上OC4J就是Orion Server,当然现在剩下多少Orion的代码就不知道了.