posts - 59, comments - 244, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          頁面緩存的小測試

          Posted on 2011-04-10 23:21 penngo 閱讀(2617) 評論(0)  編輯  收藏 所屬分類: Java
          OSCache支持JSP標簽頁面內緩存、整個頁面的緩存、對象緩存,試用了下OSCache的頁面緩存,并使用JMeter測試。
          1、使用的測試頁面代碼test1.jsp
          <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
          <html>
          <head>
          <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
          <title>Filter Test Page</title>
          <style type="text/css">
          body 
          {font-family: Arial, Verdana, Geneva, Helvetica, sans-serif}
          </style>
          </head>
          <body>
          <href="/OSCache/">返回</a><p>
          <hr>
          <b>當前時間</b>: 2011-04-09 12:20:07<br>
          <b>當前毫秒數</b>: 1302322807867<br>
          </body>
          </html>

          JMeter線程組設置:


          運行結果:


          2、把文件放在cache/test1.jsp
          并在web.xml增加配置:
           <filter>
                  
          <filter-name>CacheFilter</filter-name>
                  
          <filter-class>com.opensymphony.oscache.web.filter.CacheFilter</filter-class>
              
          </filter>
          <filter-mapping>
                  
          <filter-name>CacheFilter</filter-name>
                  
          <url-pattern>/cache/*</url-pattern>
          </filter-mapping>

          JMeter測試結果


          3、把文件放在WEB-INF/template/test1.jsp,并寫一個servlet處理文件先把test1.jsp讀取進內存HashMap,訪問時從這個HashMap中取出test1.jsp的文件內容。
          增加一個servlet文件CacheServlet.java
          import java.io.ByteArrayOutputStream;
          import java.io.File;
          import java.io.FileInputStream;
          import java.io.IOException;
          import java.io.InputStream;
          import java.util.HashMap;
          import java.util.Map;

          import javax.servlet.ServletException;
          import javax.servlet.ServletOutputStream;
          import javax.servlet.http.HttpServlet;
          import javax.servlet.http.HttpServletRequest;
          import javax.servlet.http.HttpServletResponse;

          import org.apache.commons.logging.Log;
          import org.apache.commons.logging.LogFactory;

          public class CacheServlet extends HttpServlet {
              
          private static final long serialVersionUID = 1L;
              
          private static final Map<String, byte[]> cacheMap = new HashMap<String, byte[]>();
              
          protected static final Log log = LogFactory.getLog(CacheServlet.class);

              
          public CacheServlet() {
                  
          super();
              }

              
          protected void doGet(HttpServletRequest request,
                      HttpServletResponse response) 
          throws ServletException, IOException {
                  cache(request, response);
              }

              
          protected void doPost(HttpServletRequest request,
                      HttpServletResponse response) 
          throws ServletException, IOException {
                  cache(request, response);
              }

              
          protected void cache(HttpServletRequest request,
                      HttpServletResponse response) 
          throws ServletException, IOException {
                  String path 
          = request.getSession().getServletContext().getRealPath("")
                          
          + "/WEB-INF/template";
                  String key 
          = request.getRequestURI();  //從靜態變量中取出頁面
                  byte[] by = cacheMap.get(key);
                  
                  
          if (by != null) {       //如果不為空,則直接把文件內容返回給客戶端
                      byte[] b = new byte[256];
                      
          int len = 0;
                      ServletOutputStream out 
          = response.getOutputStream();
                      out.write(by);
                      log.debug(
          "輸出緩存==============\n" );
                      out.flush();
                      out.close();
                  }
                  
          else{                 //如果為空,則先把文件內容以字節形式保存在靜態變量中,
                      File f = new File(path + "/test1.jsp");
                      StringBuffer sr 
          = new StringBuffer();
                      InputStream in 
          = new FileInputStream(f);
                      ByteArrayOutputStream  bos 
          = new ByteArrayOutputStream();
                      
          int len = 0;
                      
          byte[] b = new byte[256];
                      
          while((len = in.read(b)) > 0){
                          bos.write(b, 
          0, len);
                      }
                      
          byte[] sByte = bos.toByteArray();
                      log.debug(
          "生成緩存:" );
                      cacheMap.put(key, sByte);
                      in.close();
                      bos.close();
                      ServletOutputStream out 
          = response.getOutputStream();
                      out.write(sByte);
                      out.flush();
                      out.close();
                  }
              }
          }

          web.xml中增加內容:
          <servlet>
              
          <servlet-name>CacheServlet</servlet-name>
              
          <servlet-class>com.ocache.servlet.CacheServlet</servlet-class>
            
          </servlet>
            
          <servlet-mapping>
              
          <servlet-name>CacheServlet</servlet-name>
              
          <url-pattern>/CacheServlet</url-pattern>
            
          </servlet-mapping>
              
          <session-config>
                  
          <session-timeout>10</session-timeout>
           
          </session-config>

          先用瀏覽器訪問該sevlet,把頁面內容保存進cacheMap中,再用JMeter測試。
          測試結果:


          測試發現,服務器本身對靜態內容的處理比緩存還快。而自己寫的servlet緩存比OSCache快,主要是因為OSCache多了內部處理的代碼,至于是哈內部處理,還要看過源碼才知。

          本程序的測試環境:
          服務器:apache-tomcat-6.0.20
          緩存組件:oscache-2.4.1
          JDK:jdk1.6.0_17
          JMeter:jakarta-jmeter-2.4

          測試代碼:OSCache.zip
          主站蜘蛛池模板: 乌拉特后旗| 噶尔县| 孝义市| 科技| 运城市| 华阴市| 兴义市| 乌海市| 莱芜市| 中卫市| 肇东市| 成武县| 灵川县| 苍溪县| 剑河县| 申扎县| 重庆市| 玛多县| 凤山市| 都兰县| 镇原县| 兴海县| 兴文县| 金寨县| 大同市| 班戈县| 昌图县| 巴楚县| 连州市| 罗源县| 广河县| 宜丰县| 仲巴县| 崇礼县| 琼海市| 台湾省| 胶州市| 巨野县| 潞西市| 肥东县| 平舆县|