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