数据库打开关闭太频繁  递归的时候Connection con = null; 
建议把获取连接写在外面 避免频繁操作Connection 

解决方案 »

  1.   

    封装obtainPartNumber,再写一个方法A,在A里调用obtainPartNumber,connection在A里构建,
    然后把这个connection作为参数传递给obtainPartNumber,避免在低轨操作中对connection频繁的创建,销毁。
    看看能不能有所提高
      

  2.   

    在Java里递归查询效率肯定不会高的。你再好好看看需求找个更好的实现方式吧
      

  3.   

    我把Connection改为参数传进来,可速度没有什么变化,希望高手朋友帮忙分析一下,慢的原因和优化方案?
    改后的代码:/**
     * 此方法用来递归实现展开产品结构的功能
     * 其中的LEFT为父结点ID、RIGHT为子结点ID、CLASS2为子结点的表名(需进行表名转化)
     */
    public List obtainPartNumber(String leftobid ,Connection con   ) { 
            PreparedStatement ps
            ResultSet rs = null;
            String tableName = "";
            String partnumber = "";
            String obid = "";        try {             sql = "select /*+RULE*/ CLASS2,RIGHT from PDMM31A.ASSMSTRC where LEFT=?";
                 ps = con.prepareStatement(sql);
                 ps.setString(1, leftobid);
                 rs = ps.executeQuery();            while (rs.next()) {
                               
                             //进行表名转化,真正的对象信息存放在对应的W2PRODCT(产品)、W2ASSM(部件)等 表中
                        if (rs.getString("CLASS2").equals("W2ProMtr")) tableName = "W2PRODCT";
                    if (rs.getString("CLASS2").equals("W2AsmMtr")) tableName = "W2ASSM";
                                ……
                    string SSql = "select/*+RULE*/ PARTNUMBER from PDMM31A."+ rs.getString("CLASS2") + " where OBID=?";
                    ps = con.prepareStatement(SSql);
                    ps.setString(1, rs.getString("RIGHT"));
                    ResultSet rss = ps.executeQuery();
                    
                    if (rss.next())
                        partnumber = rss.getString("PARTNUMBER");                close(rss);
                    close(ps);
                
                     //调用函数obtainPartNumberObjectInfo获取对象信息
                    obid = obtainPartNumberObjectInfo(partnumber, tableName,con);
                    /**
                     * 
                     * 递归调用obtainPartNumber实现逐层展开功能
                     * <注意>ASSMSTRC表中RIGHT的值是与其CLASS2中的**Mtr表中某个属性的OBID相对应,
                     * 而表中的LEFT中值是与某个保存对象信息的表中的OBID相对应。
                     */
                    obtainPartNumber(obid, newvalue);                close(rss);
                    close(ps);
                }        } catch (Exception e) {            e.printStackTrace();        } finally {            close(ps);
                close(rs);
                close(cstmt);        }
            return null;    }
        
        
        
        
        
        
        
        public String obtainPartNumberObjectInfo(String partnumber,
                                                     String tablename,
                                                   connection con    ) {        PreparedStatement pss = null;
            ResultSet rs = null;
            String sql = null;
            String obid = "";        try {          sql = "select /*+RULE*/* from PDMM31A." + tablename + " where PARTNUMBER=? ";
              pss = con.prepareStatement(sql);
              pss.setString(1, partnumber);                    
              rs = pss.executeQuery();
            // 计算满足条件的记录数,PARTNUMBEROBJECT_RSCOUNT是个全局变量充当计算器的作用
                     while (rs.next()) {
                    PARTNUMBEROBJECT_RSCOUNT++;
                }            // 重新执行SQL语句,之前执行的查询操作在统计记录个数时已被用掉
                rs = pss.executeQuery();            
                
                ArrayList objectArrayList = new ArrayList();// 获得产品结构类中每个属性对象的属性信息            if (rs.next()) {
                                    //获得对象信息,保存在objectArrayList中
                    if (tablename.equals("W2PRODCT")) {// 产品
                                                //获得产品信息
                        objectArrayList.add(rs.getString("PARTNUMBER"));// 物料编码
                        objectArrayList.add("产品");// 类
                        objectArrayList.add(rs.getString("PROJECTNAME"));// 项目名称
                        objectArrayList.add(rs.getString("NOMENCLATURE"));// 名称
                        } else if (tablename.equals("W2ASSM")) {// 部件
                                                //获得部件信息
                        objectArrayList.add(rs.getString("PARTNUMBER"));
                        objectArrayList.add("部件");// 类
                        objectArrayList.add(rs.getString("PROJECTNAME"));
                        objectArrayList.add(rs.getString("NOMENCLATURE"));
                    }…… 
                                    
                    // 将每个物料的属性信息存到 PARTNUMBEROBJECTLIST 中
                    SearchResultTable o = new SearchResultTable();
                    o.setResultArrayList(objectArrayList);
                    PARTNUMBEROBJECTLIST.add(o);                obid = rs.getString("OBID");            }        } catch (Exception e) {            e.printStackTrace();        } finally {            close(pss);
                close(rs);
            }        return obid;    }
      

  4.   

    楼主 先看下数据库的数据量,再检查下数据库建立索引没有?
    JAVA不是万能的。如果你数据量比较大,而且数据库没有索引,JAVA根本不可能运行的快。因为他要等数据库运行出结果的嘛
      

  5.   

    数据库中的表数据时不太大,一般的表几千条数据,PDMM31A.ASSMSTRC表有几万条数据吧,我也建了索引啊!
      

  6.   

    如果存储过程都慢,你在怎么改java那都是没用的
      

  7.   

    使用Hibernate框架帮你解决效率问题吧,算法就没必要使用递归了,使用循环套循环就可以了,具体的层次结构可以写一个xml配置文件来实现。这样算法会比递归快很多倍
      

  8.   


    OooxiamiooO 说的方法我没用过,大家帮我分析一下看看这种方法可行吗,或者还有什么更好的方法?
      

  9.   

    谢谢朋友们的参与,等了好几天也没等到java2000_net专家的回复,不等了,结贴洒分!