public DefaultMutableTreeNode createNodes() { 
        DefaultMutableTreeNode root = new DefaultMutableTreeNode("所有类别"); 
        Medicine_BaseInfoDAO dao = new Medicine_BaseInfoDAO(); 
        Vector vec = dao.selectGoodsInfo();//从数据库得到所有商品信息 
        Vector vec2;         String type = null; 
        for (int i = 0; i  < vec.size(); i++) { 
            DefaultMutableTreeNode name = new DefaultMutableTreeNode((String) 
                    vec.get(i));//new出所有的类型名作为支节点 
            root.add(name); 
            type = (String) vec.get(i);//得到所有的商品类型 
            vec2 = dao.selectGoodsNameBYtype(type);//根据商品类型得到所有相关类型下的所有商品信息 
            for (int j = 0; j  < vec2.size(); j++) { 
                DefaultMutableTreeNode name2 = new DefaultMutableTreeNode(( 
                        String) vec2. 
                        get(j));//new出所有的特定类型下的商品名作为子节点 
                name.add(name2); 
            }         }         return root; 
    } 
此目录树根据数据库的内容循环构建,  构建内容明显过慢,   有没什么好的解决方案,   万分感谢\ selectGoodsInfo中的SQL语句select distinct Goods_fl from goods_info selectGoodsNameBYtype中的SQL语句select distinct Goods_Name from goods_info where Goods_fl=?

解决方案 »

  1.   

    selectGoodsNameBYtype被循环调用,反复发sql问,当然慢了。
    特别是,如果dao.selectGoodsNameBYtype(type)里面,每次都新createPreparedStatment的话,就更慢了。
    优化方法有2个:
    1,selectGoodsNameBYtype里面别每次都新createPreparedStatment和close。
    改成在循环外面初始化dao的selectGoodsNameBYtype用到的PreparedStatment,再循环外面close,
    那么,每次运行“select distinct Goods_Name from goods_info where Goods_fl=?”的时候,
    PreparedStatment只编译(不是指java编译,是指DB编译)一次,每次使用时是传type,可以加快一点。2,2句sql完全可以合成一句:
    select 
    distinct Goods_Name, Goods_fl
    from goods_info,
         (select distinct Goods_fl from goods_info) t1
    where goods_info.Goods_fl=t1.Goods_fl sort by t1.Goods_fl desc
    那么可以生成下面样子的表:
    Goods_Name | Goods_fl
    -------------------------
    Name11 | fl1
    Name12 | fl1
    Name13 | fl1
    Name21 | fl2
    Name22 | fl2
    Name31 | fl3用一个循环去做,如果Goods_fl改变了(fl1变成fl2了),那么商品类型增加,否则只是商品名增加。