java servlet:如何加快速度?

phi*_*ill 2 java optimization performance servlets

我有以下函数,为生成的每个订单项调用.有没有人有任何想法如何加快这一点?

private String getDetails(String doc){
    String table="";
    java.sql.ResultSet rs = qw.DBquery("select " +
        "id,LineType, QtyTotal, ManufacturerPartNumber, Description, UnitCost,UnitPrice " +
        "From DocumentItems  " +
        "where DocID="+doc+" order by linenumber " +
        "");
    table+= "<table class=inner><thead><colgroup><col id='col1'><col id='col2'><col id='col3'><col id='col4'><col id='col5'></colgroup>" +
            "<tr class='enetBlue'><th>Qty</th><th>Part Num</th><th>Description</th><th>Unit Cost</th><th>Unit Price</th></tr></thead>" +
            "<tbody>";
    try{            
        int odd = 0;
        while(rs.next()){

            int lineType = rs.getInt("LineType");
            int qty = rs.getInt("QtyTotal");
            String part = rs.getString("ManufacturerPartNumber");
            String desc = rs.getString("Description");
            float cost = rs.getFloat("UnitCost");
            float price = rs.getFloat("UnitPrice");
            String id = rs.getString("id");

            String clas="";

           if (odd==0) odd=1; else odd=0;

           clas="red";
           if (lineType==2) clas="yellow";
           if (lineType==3) clas="yellow";
           if (lineType==4) clas="yellow";
           if (qty==0) clas="yellow";
           java.sql.ResultSet rs2 = mas.DBquery("select itemkey from timitem where itemid = '"+part+"'"); 
           while (rs2.next())
           {
               if (odd==1) clas="odd";
               if (odd==0) clas="even";
           }
           table+="<tr class='"+clas+"'><td>"+qty+"</td>\n"+
                        "<td>"+part+"</td>\n"+
                        "<td>"+desc+"</td>\n"+
                        "<td>"+cost+"</td>\n"+
                        "<td>"+price+"</td></tr>\n";

                       //if clas=red | means item is not found in MAS, gear for insert. 
                       if (clas=="red") { 

                        table+="<tr ><td colspan=5><table border=1><tr><td colspan=2>\n";
                        //get unit measure key  
                        try {
                            table+="<form name=masinsert"+id+" method=get action=MASInsert>\n";

                    table+="<input type=hidden name=\"partnumber"+id+"\" value=\""+part+"\">\n";
                    table+="<input type=hidden name=\"itemcost"+id+"\" value=\""+cost+"\">\n";
                    table+="<input type=hidden name=\"itemlistprice"+id+"\" value=\""+price+"\">\n";
                    table+="<input type=hidden name=\"itemdescription"+id+"\" value=\""+desc+"\">\n";
                    table+="</td><tr>\n";

                            java.sql.ResultSet rsUM = mas.DBquery("select * from tciUnitMeasure where companyid like 'ENS' ");
                                table+="<tr bgcolor=#990033><td align=left valign=top>Unit Measure</td><td align=left valign=top><select name=\"UnitMeasKey\">";
                                        while(rsUM.next())
                                {
                                    table+="<option value=\"" + rsUM.getString("UnitMeasKey") + "\">" + rsUM.getString("UnitMeasID") + "</option>\n"; 
                            }//end while rs1 
                            table+="</select></td></tr>\n"; 


                    //build ItemClass options from mas: Puchase ProductLine 
                        java.sql.ResultSet rsPP = mas.DBquery("select * from timPurchProdLine where companyID = 'ENS'");
                        int k = 0; 

                        table+= "<tr bgcolor=#990033><td align=left valign=top>Purchase Product Line</td><td align=left valign=top><select name=\"PurchProdLine\">\n"; 
                        while(rsPP.next())
                        {
                            table+="<option value=\"" + rsPP.getString("PurchProdLineKey") + "\">" + rsPP.getString("Description") + "</option>\n"; 

                        }//end while rsPP 
                        table+="</select></td></tr>\n"; 

                        //build item classkey options
                        java.sql.ResultSet rsIC = mas.DBquery("select * from timItemClass where companyID = 'ENS' order by itemclassname desc");

                        table+= "<tr bgcolor=#990033><td align=left valign=top>Item Class :</td><td align=left valign=top><select name=\"itemclasskey\">\n"; 
                        while(rsIC.next())
                        {
                            table+="<option value=\"" + rsIC.getString("itemclasskey") + "\">" + rsIC.getString("ItemClassName") + "</option>\n"; 

                        }//end while rs1 
                        table+="</select></td></tr>";
                        table+="<tr><td colspan=2><input id='m"+id+"' type=\"button\" onclick=\"masinsert('"+ id +"')\" value=\"Add to MAS\"></td></tr>";
                        table+="</table>\n"; 

                }catch(Exception e){}   //end try

                    table+="</form>\n"; 
                        table+="</td></tr>";


                }//end if clas=red
            }//end while 
    }catch(java.sql.SQLException e){
        e.printStackTrace();}        
    table+="</tbody></table>";
    return table;
}
Run Code Online (Sandbox Code Playgroud)

提前致谢

Gan*_*alf 8

使用预编译的参数化PreparedStatment,而不是每次都使用String连接构建它.这也将解决当前代码(如果doc是用户输入的变量)易受SQL注入攻击的事实.


duf*_*ymo 7

学习如何编写JSP并停止在servlet中嵌入HTML和CSS.这在1998年是个坏主意,当时很常见; 自那以后,我们取得了长足的进步.

循环遍历一个ResultSet并在循环内执行查询时,这意味着对于您带回第一个查询的每一行的网络往返.这肯定是你问题中最大的瓶颈.消除对于初学者.

我建议将数据库代码从servlet中移出并转换为可以测试的持久性对象,而无需启动servlet引擎.

根本没有关于这种方法的面向对象.看起来像发票或BillOfMaterials,但我没有看到任何对象.


And*_*eiM 5

使用'+'运算符追加字符串非常慢,因为由于字符串的不变性,JVM需要迭代每个追加的字符串中的每个字符.

查看StringBuilder

您也可以使用SQL JOIN而不必迭代每条记录并制定新查询.你基本上只需要打一次数据库.

您的循环内部也有一个查询,它始终返回相同的数据:

 java.sql.ResultSet rsUM = mas.DBquery("select * from tciUnitMeasure where companyid like 'ENS' ");
Run Code Online (Sandbox Code Playgroud)

这应该移到循环之外,但我怀疑你可以使用JOIN消除这个和其他嵌套查询.

  • 与循环内的那些不必要的查询相比,字符串连接的任何开销都会相形见绌.他们将破坏性能. (4认同)