<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    莊周夢(mèng)蝶

    生活、程序、未來
       :: 首頁 ::  ::  :: 聚合  :: 管理

    緩存filter及資源池模式

    Posted on 2007-02-06 11:47 dennis 閱讀(1391) 評(píng)論(0)  編輯  收藏 所屬分類: 模式與架構(gòu)
    ?一。緩存過濾器模式
    1。概念:緩存過濾器模式是通過使用servlet的filter來動(dòng)態(tài)地緩存生成的頁面,從而提高web層的性能和伸縮性。工作原理非常簡(jiǎn)單,當(dāng)?shù)谝淮握?qǐng)求到來時(shí),判斷是否可以緩存,可以的話就放在緩存里。當(dāng)下次請(qǐng)求時(shí),直接從緩存中取出,而不是再次請(qǐng)求。
    2。一個(gè)簡(jiǎn)單實(shí)現(xiàn)對(duì)html頁面的緩存:
    package?cfexample.controller;

    import?java.io.*;
    import?javax.servlet.*;
    import?javax.servlet.http.*;

    /**
    ?*用來替代HttpServletReponse的新對(duì)象,以提供緩存能力
    ?
    */

    public?class?CacheResponseWrapper?extends?HttpServletResponseWrapper?{

    ????
    private?CacheOutputStream?outStream;
    ????
    ????
    //替換OutputStream和PrintWriter
    ????private?ServletOutputStream?stream;
    ????
    private?PrintWriter?writer;
    ????
    ???
    ????
    class?CacheOutputStream?extends?ServletOutputStream?{
    ?
    ????????
    private?ByteArrayOutputStream?bos;
    ?
    ????????CacheOutputStream()?
    {
    ????????????bos?
    =?new?ByteArrayOutputStream();
    ????????}

    ????????
    ????
    ????????
    public?void?write(int?param)?throws?IOException?{
    ????????????bos.write(param);
    ????????}

    ????????
    ????????
    public?void?write(byte[]?b,?int?off,?int?len)?throws?IOException?{
    ????????????bos.write(b,?off,?len);
    ????????}

    ????????
    ????????
    protected?byte[]?getBytes()?{
    ????????????
    return?bos.toByteArray();
    ????????}

    ????}

    ????
    ?????
    public?CacheResponseWrapper(HttpServletResponse?original)?{
    ????????
    super(original);
    ????}

    ????
    ????
    protected?ServletOutputStream?createOutputStream()?
    ????????
    throws?IOException
    ????
    {
    ????????outStream?
    =?new?CacheOutputStream();
    ????????
    return?outStream;
    ????}

    ????
    ????
    public?ServletOutputStream?getOutputStream()
    ????????
    throws?IOException?
    ????
    {
    ????????
    if?(stream?!=?null)?{
    ????????????
    return?stream;
    ????????}

    ????????
    ????????
    if?(writer?!=?null)?{
    ????????????
    throw?new?IOException("Writer?already?in?use");
    ????????}

    ????????
    ????????stream?
    =?createOutputStream();
    ????????
    return?stream;
    ????}

    ????
    ?????
    public?PrintWriter?getWriter()?throws?IOException?{
    ????????
    if?(writer?!=?null)?{
    ????????????
    return?writer;
    ????????}

    ????????
    ????????
    if?(stream?!=?null)?{
    ????????????
    throw?new?IOException("OutputStream?already?in?use");
    ????????}

    ????????
    ????????writer?
    =?new?PrintWriter(new?OutputStreamWriter(createOutputStream()));
    ????????
    return?writer;
    ????}

    ????
    protected?byte[]?getBytes()?throws?IOException?{
    ????????
    if?(outStream?!=?null)?{
    ????????????
    return?outStream.getBytes();
    ????????}

    ????????
    ????????
    return?null;
    ????}

    }


    //CacheFilter.java?過濾器:
    package?cfexample.controller;

    import?java.io.*;
    import?java.net.*;
    import?java.util.*;
    import?java.text.*;
    import?javax.servlet.*;
    import?javax.servlet.http.*;

    import?javax.servlet.Filter;
    import?javax.servlet.FilterChain;
    import?javax.servlet.FilterConfig;
    import?javax.servlet.ServletContext;
    import?javax.servlet.ServletException;
    import?javax.servlet.ServletRequest;
    import?javax.servlet.ServletResponse;
    public?class?CacheFilter?implements?Filter?{

    ????
    private?FilterConfig?filterConfig?=?null;
    ????
    ????
    //緩存池
    ????private?HashMap?cache;
    ????
    ????
    public?CacheFilter()?{
    ????}

    ????
    public?void?doFilter(ServletRequest?request,?
    ?????????????????????????ServletResponse?response,
    ?????????????????????????FilterChain?chain)
    ????????
    throws?IOException,?ServletException
    ????
    {
    ????????HttpServletRequest?req?
    =?(HttpServletRequest)?request;
    ????????HttpServletResponse?res?
    =?(HttpServletResponse)?response;
    ???????
    ????????
    //緩存子中的鍵URI+查詢字符串
    ????????String?key?=?req.getRequestURI()?+?"?"?+?req.getQueryString();
    ????????
    ????????
    //只緩存get請(qǐng)求的內(nèi)容
    ????????if?(req.getMethod().equalsIgnoreCase("get")?&&?isCacheable(key))?{
    ????????????
    byte[]?data?=?(byte[])?cache.get(key);
    ????????????
    ???????????
    //池中沒有,生成并存入
    ????????????if?(data?==?null)?{
    ????????????????CacheResponseWrapper?crw?
    =?new?CacheResponseWrapper(res);
    ????????????????chain.doFilter(request,?crw);
    ????????????????data?
    =?crw.getBytes();
    ????????????????cache.put(key,?data);
    ????????????}
    ?
    ????????????
    ????????????
    //?如果有的話,直接得到返回
    ????????????if?(data?!=?null)?{
    ????????????????res.setContentType(
    "text/html");
    ????????????????res.setContentLength(data.length);
    ????????????????
    ????????????????
    try?{
    ????????????????????OutputStream?os?
    =?res.getOutputStream();
    ????????????????????os.write(data);
    ????????????????????os.flush();
    ????????????????????os.close();
    ????????????????}
    ?catch(Exception?ex)?{
    ????????????????????ex.printStackTrace();
    ????????????????}

    ????????????}

    ????????}
    ?else?{
    ????????????
    //?generate?the?data?normally?if?it?was?not?cacheable
    ????????????chain.doFilter(request,?response);
    ????????}

    ????}

    ????
    ????
    //判斷是否可以緩存,考慮一個(gè)配置文件配置哪些可以緩存,此處省去
    ????private?boolean?isCacheable(String?key)?{
    ????????
    return?true;
    ????}

    ????
    ????
    ????
    public?void?init(FilterConfig?filterConfig)?{
    ????????
    this.filterConfig?=?filterConfig;
    ????????
    ????????cache?
    =?new?HashMap();
    ????}

    ????
    public?void?destroy()?{
    ????????cache.clear();
    ????????
    ????????cache?
    =?null;
    ????????filterConfig?
    =?null;
    ????}

    }



    3.實(shí)際應(yīng)用例子:oscache是很好的解決web層緩存的方案!!準(zhǔn)備認(rèn)真讀讀它的源代碼。

    二。資源池模式:
    1。概念:一個(gè)資源池就是一組預(yù)先生成的對(duì)象,它們可以被出借以便節(jié)省多次chuang創(chuàng)建它們所花費(fèi)的時(shí)間。典型的如:EJB池(Service Locator一般都有一個(gè)ejb的home接口池),數(shù)據(jù)庫連接池。

    2。優(yōu)點(diǎn):A。提高了應(yīng)用的可伸縮性,使資源的創(chuàng)建和開銷不至于失控。B,產(chǎn)生了一個(gè)統(tǒng)一的有效微調(diào)點(diǎn),通過運(yùn)行時(shí)修改池參數(shù)來影響應(yīng)用的性能等因素。

    3。簡(jiǎn)單實(shí)現(xiàn):
    (1)首先一個(gè)創(chuàng)建對(duì)象的工廠:
    package?pool;

    public?interface?ResourceFactory?{
    ????
    public?Object?createResource();
    ????
    ????
    //驗(yàn)證返回的資源,并提供還原
    ????public?boolean?validateResource(Object?o);
    }


    (2)資源池:

    package?pool;

    import?java.util.*;

    public?class?ResourcePool?{
    ????
    private?ResourceFactory?factory;
    ????
    ???
    //參數(shù)
    ????private?int?maxObjects;
    ????
    private?int?curObjects;
    ????
    private?boolean?quit;
    ????
    ????
    //出借的資源
    ????private?Set?outResources;
    ????
    ????
    //可以使用的資源
    ????private?List?inResources;
    ????
    ????
    public?ResourcePool(ResourceFactory?factory,?int?maxObjects)?{
    ????????
    this.factory?=?factory;
    ????????
    this.maxObjects?=?maxObjects;
    ????????
    ????????curObjects?
    =?0;
    ????????
    ????????outResources?
    =?new?HashSet(maxObjects);
    ????????inResources?
    =?new?LinkedList();
    ????}

    ????
    ???
    //從池中取資源
    ????public?synchronized?Object?getResource()?throws?Exception?{
    ????????
    while(!quit)?{
    ????????
    ?????????????
    if?(!inResources.isEmpty())?{
    ????????????????Object?o?
    =?inResources.remove(0);
    ????????????????
    ???????????????
    if(!factory.validateResource(o))
    ????????????????????o?
    =?factory.createResource();
    ????????????????
    ????????????????outResources.add(o);
    ????????????????
    return?o;
    ????????????}

    ????????????
    ????????????
    //放入出借池
    ????????????if(curObjects?<?maxObjects)?{
    ????????????????Object?o?
    =?factory.createResource();
    ????????????????outResources.add(o);
    ????????????????curObjects
    ++;
    ????????????????
    ????????????????
    return?o;
    ????????????}

    ????????????
    ????????????
    //沒有可用的,等待
    ????????????try?{?wait();?}?catch(Exception?ex)?{}
    ????????}

    ????
    ???????
    //池子已經(jīng)銷毀
    ????????return?null;
    ????}

    ????
    ????
    //歸還資源
    ????public?synchronized?void?returnResource(Object?o)?{
    ????????
    ????????
    if(!outResources.remove(o))
    ????????????
    return;
    ????????
    ????????inResources.add(o);
    ????????notify();
    ????}

    ????
    ????
    public?synchronized?void?destroy()?{
    ????????quit?
    =?true;
    ????????notifyAll();
    ????}

    }



    4.實(shí)例:很多開源的數(shù)據(jù)庫連接池,ejb模式中的Service Locator等等
    主站蜘蛛池模板: 成全视频免费观看在线看| 热99re久久精品精品免费| 日本免费污片中国特一级| 亚洲三级在线免费观看| 国产a级特黄的片子视频免费| 亚洲国产综合久久天堂| 亚洲精品自在线拍| 性生大片视频免费观看一级| 24小时免费看片| 亚洲国产91精品无码专区| 亚洲综合久久久久久中文字幕| 久久精品国产影库免费看| 亚洲精品A在线观看| 人禽伦免费交视频播放| 国产成人综合亚洲AV第一页| 亚洲乱人伦中文字幕无码| 6080午夜一级毛片免费看| 91亚洲精品视频| 东方aⅴ免费观看久久av| 久久久久久久尹人综合网亚洲| 九九精品国产亚洲AV日韩| 一色屋成人免费精品网站| 亚洲国产精品VA在线看黑人| 久久久久免费精品国产小说| 国产亚洲日韩在线三区| 国产一精品一av一免费爽爽| 亚洲精品在线视频观看| 天天天欲色欲色WWW免费| 亚洲精品国产福利在线观看| 可以免费看黄视频的网站| 日本亚洲欧美色视频在线播放| 亚欧人成精品免费观看| 亚洲成AV人片在WWW| 成视频年人黄网站免费视频| 亚洲美女视频一区| 大陆一级毛片免费视频观看 | 四虎影视永久免费观看| 一边摸一边爽一边叫床免费视频 | 免费中文字幕在线观看| 亚洲成AV人片在WWW| 亚洲精品无码鲁网中文电影|