求助

04-06-21 qiusi
本人接手解决一个J2EE速度问题。

BusinessDelegate有一perform(ValueObject inParm, ValueObject outParm)方法

该方法会调用session的perform(ValueObject inParm,
ValueObject outParm)方法。其中ValueObject是继承自
序列化的对象。返回值是采用outParm.setXXX方法。
我在某session perform首端和末端测试执行时间为20秒,
然而从BusinessDelegate的perform出来时间居然会多出一
倍多!

我猜测是因为数据传递问题。但因为传递的数据不是很多,
大概几十条,而且web端和ejb都在同一台服务器上。

是否是因为引用传值引起?本人是ejb初学者,盼高人解释
其原理。

另外发现拿多个数据时,entity端程序居然只拿出一个
主健list。然后调用段就可以强制转化成远端Object,这样
做原理是什么?效率怎么样?通常如何做?

万分感激

wwlhp@jdon
2004-06-21 17:17
如果不使用本地接口,对ejb的调用默认都是远程调用。而远程调用是一个非常复杂的过程,是整个应用程序的瓶颈所在。许多ejb设计模式都在想方设法减少ejb远程调用次数,这样可以显著提高程序的性能。
如果你的web容器和ejb容器都在同一个虚拟机内部,可以使用ejb的本地接口,据说这样不会使用rmi了,但我没有试过。

banq
2004-06-21 18:42
1. 你的BusinessDelegate有性能问题,有点我的书中的那个BusinessDelegate的,那个BusinessDelegate就是有性能方面的提升没有做,至于如何完善BusinessDelegate性能,途径有很多,具体情况分析。

将EJB设置成Local,减少远程开销是基本方法。wwlhp@jdon 建议值得参考。

2.关于“entity端程序居然只拿出一个
主健list。然后调用段就可以强制转化成远端Object,这样
做原理是什么?效率怎么样?通常如何做?”

我也做过这事情,在我的书中最后一张查询批量数据就是这么做的,不知是否是你说的这种情况。




qiusi
2004-06-22 10:47
谢谢楼上两位。

在www.javaeye.com/27.html这篇文章中把EJB调用原理讲得
非常清楚。不只两位可否介绍一下如何返回数据?

banq,那个情况和你所讲相同。请教一下为什么可以那样做。

我现在在国外,所以没法去听讲,甚为遗憾。

qiusi
2004-06-22 10:56
取得批处理数据,以下四种方法
1.用一个select语句取得所有主健,然后在客户端
循环调用ejbFindXXX
2.用一个select语句取得所有主健,然后客户端强制
转换为ejbObject
3.直接使用DAO返回valueobject list
4.在ejb中调用DAO再返回

这些方法效率和设计思想上有什么区别?

特别我看到很多ejb pattern中都是使用ejb间接调用
DAO,为什么不直接连接数据库?

yangzheng
2004-06-22 14:26
> 特别我看到很多ejb pattern中都是使用ejb间接调用
> DAO,为什么不直接?
>

ejb架构中的entity bean和DAO是属于同一层次,都是给session bean提供对数据库的访问,当需要获取批量数据的时候,一般都采用DAO的方式,效率高.

不清楚你说的直接连接数据库是什么意思,难道是由app端吗,那商业逻辑放在哪里呢?

banq
2004-06-22 17:27
to qiusi
可惜,看来你还是没有搞清楚EJB调用原理,返回数据的效率高低是依据其EJB调用原理决定的。

我的书籍是《Java实用系统开发指南》,可网上订购,其中介绍了两种BusinessDelegate框架,一种类似你说的,性能不好,一种则效率高

在书籍中,说了为什么采取返回结果集的做法,这里一下不能贴太多,sorry

session中直接调用数据库,耦合性太强,看看J2EE核心模式中为什么要使用DAO模式介绍。