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)
提前致谢
学习如何编写JSP并停止在servlet中嵌入HTML和CSS.这在1998年是个坏主意,当时很常见; 自那以后,我们取得了长足的进步.
循环遍历一个ResultSet并在循环内执行查询时,这意味着对于您带回第一个查询的每一行的网络往返.这肯定是你问题中最大的瓶颈.消除对于初学者.
我建议将数据库代码从servlet中移出并转换为可以测试的持久性对象,而无需启动servlet引擎.
根本没有关于这种方法的面向对象.看起来像发票或BillOfMaterials,但我没有看到任何对象.
使用'+'运算符追加字符串非常慢,因为由于字符串的不变性,JVM需要迭代每个追加的字符串中的每个字符.
您也可以使用SQL JOIN而不必迭代每条记录并制定新查询.你基本上只需要打一次数据库.
您的循环内部也有一个查询,它始终返回相同的数据:
java.sql.ResultSet rsUM = mas.DBquery("select * from tciUnitMeasure where companyid like 'ENS' ");
Run Code Online (Sandbox Code Playgroud)
这应该移到循环之外,但我怀疑你可以使用JOIN消除这个和其他嵌套查询.
| 归档时间: |
|
| 查看次数: |
1493 次 |
| 最近记录: |