质量属性_性能战术

性能战术
性能性:性能是指系统的响应能力。性能与时间有关。事件(中断、消息、用户请求或时间已到)发生时,系统必须做出响应。事件到达和相应有很多特性,但性能基本上与事件发生时,将要耗费系统多长时间做出响应有关。
  *时间、空间(如:内存)架构平衡时间空间
目标:对一定时间限制内到达系统的时间生成一个响应,这些事件可以是消息到达、定时器到时,系统状态的变化。

影响响应时间的两个因素:
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);

  

posted @ 2020-03-02 18:03  枫黎  阅读(283)  评论(0编辑  收藏  举报