您的位置:首页 > 其它

如何根据采集的请求和参数做性能优化

2012-12-11 16:57 148 查看
        在做系统优化的时候,我们会想找出用户使用最多的功能进行优化,让优化的效果最大化。但问题来了,对于一个查询,查询条件那么多,不可能做到每个条件都优化,那怎么优化呢?通过监控软件找到用户操作带的参数,可以推断出哪些查询条件用的最多,进行直接优化这些条件组装的SQL。

        请求后面的参数为:vendorId=&isEmergent=&subprojectId=&desiredVendorId=&remark=&creator=&programName=&materialName=500V铜芯低压电线,(双塑)BVV-4

        下列程序是可以统计参数使用的次数,用Map进行排序。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.Map.Entry;
public class DataAnalysis{
public static void main(String arg[]) throws Exception {
Map map = new TreeMap<String,Integer>();
List list = queryHTTP();
//对请求的条件进行统计
staticParameterCount(list,map);
//打印请求参数调用次数
printUseParameterCount(map);
}
/**
*
* @param list  查询的请求的参数部分
* @param map  分割参数的集合
*/
private static void staticParameterCount(List list,Map map){
for(int hi=0,count=list.size(); hi < count; hi++){
String[] httpArray = ((String)list.get(hi)).split("&");
for(int i=0; i< httpArray.length;i++){
String[] temp = httpArray[i].split("=");
if(temp.length == 2){
//如果存在则加1,如果不存在则设置为1
if(map.containsKey(temp[0])){
Integer useCount = (Integer)map.get(temp[0])+1;
map.put(temp[0], useCount);
}else{
map.put(temp[0], 1);
}
}
}
}
}
/**
*打印出个请求参数使用的次数
* @param map
*/
private static void printUseParameterCount(Map map){
//过滤掉一些参数
Set set = new HashSet();
set.add("pageNo");
set.add("actionType");
set.add("actionMode");
set.add("org.apache.struts.taglib.html.TOKEN");
set.add("pageSize");
List<Entry<String,Integer>> parameters = new ArrayList<Entry<String,Integer>>(map.entrySet());
Collections.sort(parameters, new Comparator<Map.Entry<String, Integer>>() {
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
return (o1.getValue()).compareTo(o2.getValue());
}
});
for (Entry<String, Integer> e: parameters){
if(!set.contains(e.getKey())){
System.out.println(e.getKey()+">>>>>>>"+e.getValue());
}
}
}
/**
* 查询出http的参数
* @return
* @throws Exception
*/
private static List queryHTTP()  throws Exception {
String DBDRIVER = "oracle.jdbc.driver.OracleDriver" ;
String DBURL = "jdbc:oracle:thin:@127.0.0.1:1521:orcl" ;
String DBUSER = "datasource" ;
String DBPASSWORD = "datasource" ;
ResultSet rs = null;
Connection conn = null ;
Statement pstmt = null;
List list = new ArrayList();
try {
Class.forName(DBDRIVER) ;
conn = DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD) ;
pstmt = conn.createStatement();
StringBuffer strSQL = new StringBuffer();
strSQL.append("select t.http_id,t.response_time,d.http_text, ");
strSQL.append(" replace(replace(t.parameters, '&' || '#61;', '='),'&' || 'amp;','&') http");
strSQL.append(" from emc_http t, emc_http_dictionary d ");
strSQL.append(" where t.http_dic_id = d.http_dic_id ");
strSQL.append(" and d.http_text like '%requirementTrackAction.do%' ");
pstmt =conn.prepareStatement(strSQL.toString(), ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
rs = pstmt.executeQuery(strSQL.toString());
while (rs.next()) {
list.add(rs.getString("http"));
}
return list;
} catch (Exception ex) {
ex.printStackTrace();
return list;
}finally{
try  {
conn.close() ;
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: