质量属性_性能战术
性能战术
性能性:性能是指系统的响应能力。性能与时间有关。事件(中断、消息、用户请求或时间已到)发生时,系统必须做出响应。事件到达和相应有很多特性,但性能基本上与事件发生时,将要耗费系统多长时间做出响应有关。
*时间、空间(如:内存)架构平衡时间空间
目标:对一定时间限制内到达系统的时间生成一个响应,这些事件可以是消息到达、定时器到时,系统状态的变化。
影响响应时间的两个因素:
1.资源消耗:资源包括CPU、数据存储、网络通信带宽和内存等;资源消耗是指实际需要耗费的时间;
资源消耗包括:每个事件都要经过一定的处理序列
2.闭锁时间:由于资源争用、资源不可用或长时间计算导致事件无法处理,这是指计算机可能等待的时间。
三个分类:
1.资源需求-分析影响性能的资源因素
事件流是需求的源;
需求两个特性:
1.资源流中事件之间的时间间隔
2.每个请求所消耗的资源
资源需求战术:
1.减少处理一个事件流所需要的资源。
1.提高计算效率
2.减少计算开销
2.减少所处理事件的数量
3.控制资源的使用
1.限制执行时间
2.限制队列大小
2.资源管理-提高资源的应用效率
1.引入并发
2.维持数据或计算的多个副本
3.增加可用资源
3.资源仲裁-解决资源的争用
1.先进先出
2.固定优先级
3.动态优先级:轮转,时限时间最早优先
4.静态调用
在查询数据时,可以增加全文索引,提高查询速度。
在应用中,进行数据查询,每次查询结果均可建立新表存储结果,下次再查询该关键词时,可直接从以该关键词命名的表直接查询,减少了需要处理数据的条数,同时维持查询数据的副本,同时也增加了可用资源。所要查询的数据减少,所消耗的资源肯定也减少了,需要时间也减少。
创建表
根据sql语句对查询进行结果表的创建,在后台将创建结果展示。
String sql = "create table "+key+" (select * from words where baike like '%"+key+"%')";
/*** * 创建表 * @throws SQLException */ public void createtable(String key) throws SQLException { String sql = "create table "+key+" (select * from words where baike like '%"+key+"%')"; Connection conn = DBUtil.getConnection(); Statement stmt = null; //执行创建表 System.out.println("//创建表"); stmt = conn.createStatement(); if(0 == stmt.executeLargeUpdate(sql)) { System.out.println("成功创建表!"); } else { System.out.println("创建表失败!"); } DBUtil.close(conn); DBUtil.close(stmt); }
dao层
先判断要查询的关键词表是否存在,若存在则直接从该关键词基本表进行全部查询,若表不存在,则调用创建表函数createtable(keyword),建立相关关键词表。
同时,在数据库调用完成之后,要及时关闭数据库,减少资源占用。
public List<Bean> list_keyword(String keyword) throws SQLException { createtable(keyword); String sql = "select * from "+keyword+""; // String sql = "select * from words where baike like '%"+keyword+"%'"; List<Bean> list = new ArrayList<>(); Connection conn = DBUtil.getConnection(); Statement state = null; ResultSet rs = null; try { //查询表是否存在 // ResultSet tables = conn.getMetaData().getTables(null, null, keyword, null ); // if(tables.next()) { // System.out.println(keyword+"表存在!"); // sql = "select * from '"+keyword+"'"; state = conn.createStatement(); rs = state.executeQuery(sql); Bean bean = null; while (rs.next()) { int id = rs.getInt("id"); String word = rs.getString("word"); String baike = rs.getString("baike"); String baike_address = rs.getString("baike_address"); bean = new Bean(id,word,baike,baike_address); list.add(bean); }//while } catch (SQLException e) { e.printStackTrace(); } finally { DBUtil.close(conn); DBUtil.close(state); DBUtil.close(rs); } return list; }
servlet
通过前端调用,将查询结果进行传值。
private void keyword(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException, SQLException { // TODO Auto-generated method stub // request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf8"); request.setCharacterEncoding("utf-8"); response.getWriter().append("Served at: ").append(request.getContextPath()); String keyword = request.getParameter("keyword"); System.out.println(keyword); List<Bean> list=dao.list_keyword(keyword); System.out.println(list.size()); System.out.println(list.get(0).toString()); request.setAttribute("list", list); request.getRequestDispatcher("list.jsp").forward(request,response); }
在dao层调用,少考虑了一个问题,多次查询的时候,表存在,这样就会报错,于是乎,在建表时添加一个判断,if 表存在,则不建表else建表
//查询表是否存在 ResultSet tables = conn.getMetaData().getTables(null, null, keyword, null ); if(tables.next()) { System.out.println(keyword+"表存在!");} else createtable(keyword);