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

        在做系统优化的时候,我们会想找出用户使用最多的功能进行优化,让优化的效果最大化。但问题来了,对于一个查询,查询条件那么多,不可能做到每个条件都优化,那怎么优化呢?通过监控软件找到用户操作带的参数,可以推断出哪些查询条件用的最多,进行直接优化这些条件组装的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();
            }
        }
    }
   }

你可能感兴趣的:(如何根据采集的请求和参数做性能优化)