牛仔裤的夏天

JAVA是蓝色的- online

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  30 随笔 :: 5 文章 :: 15 评论 :: 0 Trackbacks
在Jdon.com里面看到的,觉得很值得借鉴
原文:http://www.jdon.com/jive/thread.jsp?forum=16&thread=302

看下面比较:

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");
      }

   }

}

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


posted on 2006-03-15 16:56 luckyrobbie 阅读(5448) 评论(6)  编辑  收藏 所属分类: Java

评论

# re: 一个取到ResultSet后返回Iterator的例子 2006-03-15 18:00 剑事
两种方法各有优点
不过感觉也都一般
第一个占内存,损失了内存又没方便多少
第二个占连接,损失了连接又没快多少

http://www.blogjava.net/jfy3d/archive/2005/05/12/4185.html
我实现的比第一个方便  回复  更多评论
  

# re: 一个取到ResultSet后返回Iterator的例子 2006-03-15 20:40 luckyrobbie
“第二个占连接,损失了连接又没快多少” 没损失,连接断了后rs依然存在的

你的做法和我以前的做法一样的,把一行放在一个HashMap中,然后把结果集封装在一个Vector或者ArrayList中,然后在通过客户化的标签进行View的显示,你可以看我这篇随笔http://www.blogjava.net/luckyrobbie/archive/2006/03/10/34648.aspx  回复  更多评论
  

# re: 一个取到ResultSet后返回Iterator的例子 2006-03-16 07:25 剑事
连接con.close后
next = rs.getString(1);
是不能用的
不知道你亲手测试了没  回复  更多评论
  

# re: 一个取到ResultSet后返回Iterator的例子 2006-03-16 08:27 luckyrobbie
connection关闭后,resultset是可以遍历的
statement关闭后,就不能遍历了  回复  更多评论
  

# re: 一个取到ResultSet后返回Iterator的例子 2006-03-16 08:54 boss_ch
connection关闭后,resultset是可以遍历的
这是因为在使用连接池的情况下,Connection.close 是把连接返回给连接池了,但是没有实际的关闭数据库的网络连接,所以,rs 是可以遍历的,但是这时候 Conention 的状态就不是刚创建连接时的状态了。 

实际上,上文所说的这种迭代模式,实在是一个坏做法。不要误导初学者  回复  更多评论
  

# re: 一个取到ResultSet后返回Iterator的例子 2006-03-16 09:24 luckyrobbie
@boss_ch
不用连接池啊
为何你认为是不好的做法?  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: