问题2: 通常页面的大量数据显示用什么方案? 内详

steeven 2003-05-07 06:43:35
已知几种方案:
1. 通常直接返回Remote Entity Bean, 然后对每个bean执行get/set, 但是每次get/set会导致大量的网络开销, 可能是懒人的办法
2. 有人说客户端, 通常是Servlet和EJB在一个虚拟机上, 可以用Local Entity Bean. 不知道效果怎样? 优缺点如何?
3. 对大量数据查询直接在session Bean中调用jdbc, 用RowSet返回. 因为RowSet读取数据不是强类型, 必须用getString("xxx")来得到数据, 容易出错.
4. ValueObject, 是不是对要返回的数据生成对应的javaBean. 那么不同的查询可能要自行定义很多ValueObject, 而且Entity到ValueObject的转换这样的大量代码谁来写?

请过来人指点 :)
...全文
61 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
steeven 2003-05-13
  • 打赏
  • 举报
回复
up
steeven 2003-05-12
  • 打赏
  • 举报
回复
使用方案4的朋友用什么代码生成工具没?
proZeus 2003-05-12
  • 打赏
  • 举报
回复
我用3+4
wobensuren 2003-05-11
  • 打赏
  • 举报
回复
1. 通常直接返回Remote Entity Bean, 然后对每个bean执行get/set, 但是每次get/set会导致大量的网络开销, 可能是懒人的办法

这种方法速度很慢!!

3. 对大量数据查询直接在session Bean中调用jdbc, 用RowSet返回. 因为RowSet读取数据不是强类型, 必须用getString("xxx")来得到数据, 容易出错.

我用了第3种 还不错!
steeven 2003-05-11
  • 打赏
  • 举报
回复
楼上的好象文不对题啊
sallina 2003-05-08
  • 打赏
  • 举报
回复
转:查询数据库后是返回ResultSet还是返回Collection?
既然我们把数据库访问封装起来了,那么如果查询数据库返回的是一系列结果,比如我们从数据库中得到所有人的用户名,然后在Jsp页面显示出来。

这里就有一个普遍疑问,我这个javabean是返回ResultSet到Jsp中还是Collection?

我曾经有段时间图省事,直接返回ResultSet,然后在我的jsp页面中是大量的ResultSet遍历。这其实还是将数据层和显示层混淆在一起。在EJB CMP中,返回的是Collection,这样偶合性降低,不用在修改数据库结构后,一直修改程序到前台Jsp页面,这和以前的php Asp开发方式没两样。

但是返回Collection效率不是很高,因为意味着在内存中要开辟一个内存存放所有的结果。

我看了http://builder.com.com/article.jhtml?id=u00220020814R4B01.htm这篇文章后,觉得启发很大,返回Iterator就可以了。

Iterator也是个模式,在Jive中大量使用了Iterator,我以前很奇怪,为什么他没事自己写个Iterator,现在知道原因了,这样节省内存,而且效率高。

看下面比较:

public List getUsers() {
ResultSet rs = userDbQuery();
List retval = new ArrayList();
while (rs.next()) {
retval.add(rs.getString(1));
}
return retval;
}
上面是个我们采取返回Collection后最常用的方法,将ResultSet中的用户名加入List再返回,显然这很耗费内存。

使用Iterator返回:
public Iterator getUsers() {
final ResultSet rs = userDbQuery();
return new Iterator() {
private Object next;

public void hasNext() {
if (next == null) {
if (! rs.next()) {
return false;
}
next = rs.getString(1);
}
return true;
}

public Object next() {
if (! hasNext()) {
throw new NoSuchElementException();
}
String retval = next;
next = null;
return retval;
}

public void remove() {
throw new UnsupportedOperationException("no remove allowed");
}
}
}

这里返回的是一个内部类,其实你可以象Jive那样,专门做个Iterator类,这样,这里写得就不那么难看,你自己定义的Iterator和Collection中的Iterator没有任何关系,自己定义了三个方法 hasNext(); next(); remove();这样看上去和Collection的Iterator是一样的。

从自己作的这个Iterator类中看到,这个Javabean只是做了一个指针传递作用,将调用本Javabean的指针传递到ResultSet,这样既提高了效率,节约了内存,又降低了偶合性,这是堪称中间件典型的示范。

既然返回iterator这么好,有人经常用到一个简单的返回Iterator方法:
public Iterator getUsers() {
ResultSet rs = userDbQuery();
List list = new ArrayList()
while (rs.next()) {
list.add(rs.getString(1));
}
return list.iterator();
}

这其实和直接返回list没区别,还是浪费内存。
pcliu1980 2003-05-07
  • 打赏
  • 举报
回复
up

67,538

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧