Freaky ?!……

Freaky 不仅是一个名字,他更是一种信念、一种承诺,Only Freaky,也许你就能体会……

用户操作
[即时聊天] [发私信] [加为好友]
QuanFreakyID:Freaky
18728次访问,排名6913(2),好友6人,关注者11人。
Freaky 不仅是一个名字,他更是一种信念、一种承诺,Only Freaky,也许你就能体会……
Freaky的文章
原创 22 篇
翻译 0 篇
转载 0 篇
评论 5 篇
Freaky的公告

本blog文章未经特别声明,均转载自互联网。

联系我:freaky@vip.sina.com

最近评论
vvukqr:WoW Gold
hadavidlu:写的不错
matrixy:mark
xjffj:内容都是比较老了,不过还是支持一下吧。另外现在IO操作都改NIO的channel了。
penpen:good
文章分类
收藏
    相册
    技术站点
    朋友的网站
    BOBE的个人网站
    星际论坛
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 查询数据库后是返回ResultSet还是返回Collection?收藏

    新一篇: 细说Java之util类 | 旧一篇: 【原创】java调用Oracle存储过程时,处理cursor类型的方法。

    banq http://www.jdon.com Aug 21, 2002 2:23 PM

    既然我们把数据库访问封装起来了,那么如果查询数据库返回的是一系列结果,比如我们从数据库中得到所有人的用户名,然后在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没区别,还是浪费内存。

    发表于 @ 2005年01月21日 14:49:00|评论(loading...)|编辑

    新一篇: 细说Java之util类 | 旧一篇: 【原创】java调用Oracle存储过程时,处理cursor类型的方法。

    评论:没有评论。

    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © Freaky