《》 OSCache

性能方案:

1.页面静态化。只适合那些不会经常发生变化的页面(不适合条件查询和分页)。

对于经常发生变化的内容,如何进行性能优化

2.缓存方案。

  1.页面缓存(性能高于二级缓存)

  2.业务层缓存(二级缓存,只缓存对象),hibernate二级缓存

页面缓存

1.页面缓存的是servlet向页面输出的html代码,我们使用OsCahe作为页面缓存产品。OsCahe也可以用作二级缓存。

什么是OSCache

OSCache标记库由OpenSymphony设计,它是一种开创性的JSP定制标记应用,提供了在现有JSP页面之内实现快速内存缓冲的功能。OSCache是一个广泛采用的高性能的J2EE缓存框架,OSCache能用于任何Java应用程序的普通的缓存解决方案。OSCache有以下特点:缓存任何对象,你可以不受限制的缓存部分jsp页面或HTTP请求,任何java对象都可以缓存。拥有全面的API--OSCache API给你全面的程序来控制所有的OSCache特性。永久缓存--缓存能随意的写入硬盘,因此允许昂贵的创建(expensive-to-create)数据来保持缓存,甚至能让应用重启。支持集群--集群缓存数据能被单个的进行参数配置,不需要修改代码。缓存记录的过期--你可以有最大限度的控制缓存对象的过期,包括可插入式的刷新策略(如果默认性能不需要时)。

使用OsCahe如何实现页面全局和局部缓存。

只需要学习几个标签

采用map结构的对象缓存内容,这个缓存的key就是我们请求的路径。以后只要我们访问相同的路径,就可以在map中找到这个缓存的内容。但是如果我们在路径后面加上参数,map中就找不到了。缓存就不会被使用了。

所以我们可以自己指定缓存的key的名称。

scope可以定义这个缓存的使用范围,session只对同一个会话进行缓存

time指定缓存时间,默认是1个小时。过时以后,旧缓存会丢失,重新建立新的缓存。

refresh:强行清除缓存。里面可以接收el表达式,true表示重新建立缓存。默认为false。

下面是一些示例

我们使用OsCache的标签<cache></cache>来进行页面的局部缓存.使用方法如下:

<%@taglib uri="http://www.opensymphony.com/oscache" prefix="cache"%>

<cache:cache>

<%=new Date() %>

</cache:cache>

缓存的key将以请求的URI+查询字串组成,如果你访问/oscache/index.jsp?name=ttt和/oscache/index.jsp?name=ppp将得到两份缓存。缓存默认存放在application范围,缓存时间默认为3600秒,即1小时.

<cache:cache  key=“name”>

        name=${param.name}

</cache:cache>

这时候缓存将以name为key,不再是请求的URI+查询字串组成,所以如果你访问/oscache/index.jsp?name=ttt和/oscache/index.jsp?name=ppp将得到一份缓存。

<cache:cache key="name" scope="session">

        name=${param.name}

</cache:cache>

缓存范围设置为session,这时候缓存保存在用户的session中,如果用户把浏览器关闭,再重新打开一个新浏览器,原来缓存的内容将不存在。

<cache:cache key="name" time="10">

        name=${param.name}

</cache:cache>

上面设置了缓存的时间为10秒,超过10秒后,缓存的内容将失掉。

<cache:cache key="name" time="60" refresh="${param.refresh}">

        name=${param.name}

</cache:cache>

refresh为true将会导致缓存的内容过期而被清除,简单地说,该属性为true用于清除缓存。

人为管理缓存<flush />标签:

<cache:flush scope="application" />

清除application范围内的所有缓存

<cache:flush scope="session" key="foobar" />

清除session范围内的key为foobar的缓存。

<cache:flush scope="application" group="currencyData" />

清除application范围内组名为currencyData内的所有缓存。



全局缓存

实际上就是在web.xml里配置一个filter

页面全局缓存将使用Filter实现:

<filter>

    <filter-name>CacheFilter</filter-name>

    <filter-class>com.opensymphony.oscache.web.filter.CacheFilter</filter-class>

    <init-param>

        <param-name>time</param-name>

        <param-value>60</param-value>

    </init-param>

    <init-param>

        <param-name>scope</param-name>

        <param-value>application</param-value>

    </init-param>

</filter>

<filter-mapping>

    <filter-name>CacheFilter</filter-name>

对指定url的页面进行缓存

    <url-pattern>/product/list/*.jsp</url-pattern>

</filter-mapping>

我们应该把这个filter放在web.xml最前面,这样当用户访问某个缓存中存在的内容,就直接返回缓存中的内容,后面filter中的工作就不会有机会做,事实上也没有必要做,这样可以提高性能。

缓存的key将以请求的URI+查询字串组成,如果你访问/oscache/index.jsp?name=ttt和/oscache/index.jsp?name=ppp将得到两份缓存。缓存是在初次访问页面时进行的,后续的请求将会返回缓存中的内容。缓存中存放的内容为页面返回给用户的html源代码。



全局缓存原理

在filter中大概是这样的:

内部保存html的是一个map,以当前请求的url为key,当一个请求到达是这样的

Filter{

   判断当前map中是否包含这个url,如果包含就返回map中保存的这个url相关的html,doFilte中的代码就不会被执行,

     If(map.contains(url)){

               Response.write(map.get(url));

}else{

如果map中没有这个url,就需要向服务器请求,为了保存服务器返回的html页面内容,需要对response对象进行一次包装,让他能够保存这个html页面

         WarpedResponse = ResopnsWarpp(response)

//注意,执行请求的时候的response对象已经是被包装后的了,里面有一个cache字段保存服务器返回的html代码

         doFilter(request, WarpedResponse)

然后把返回的html保存进自己的map中

         Map.put(url, WarpedResponse.getCache)

}

}

OSCache的配置属性介绍

cache.memory=true

指定是否使用内存缓存,默认值为true,即使用内存缓存。

cache.capacity

指定缓存的容量,默认的容量是无限的。我们可以为它设置缓存数量,如:

cache.capacity=100000

如果我们要使用硬盘缓存,可以这样设置:

cache.memory=false

cache.path=d:\\cache  (指定,缓存保存的路径,注意:路径应采用双\符)

cache.persistence.class=com.opensymphony.oscache.plugins.diskpersistence.DiskPersistenceListener

cache.persistence.class用于设置持久化类。



关于二级缓存

如果数据需要实时更新,就必须用二级缓存

我们对实体的更新会同步到二级缓存,以后取数据都是从二级缓存中获取,而二级缓存总是保证实时更新的,所以提高了性能。

使用二级缓存和使用页面缓存的对比

他们都可以实现性能的提高,减轻服务器的压力,二级缓存可以实现数据的实时更新,如果数据不需要实时更新,页面缓存性能要高于二级缓存。因为如果使用二级缓存,我们的执行步骤是这样的

1. 发送*.do的请求,由中央控制器发送到对应的action

2. 在action中,spring注入service层对象,执行execute方调用service.find方法,这个方法可以从二级缓存中取得数据,不需要调用数据库。

3. 把action中获得的数据发送到页面,jsp负责解析数据,生成html代码。

如果使用页面缓存,这些工作在filter中从保存缓存html的map中就可以取得html页面,直接response.write就可以了。工作流程比二级缓存简单多了





关于缓存的问题:

缓存的内容被保存在一台机器,如何在多台服务器上共享。

解决方案:分布式缓存,最好使用jbossCache。如果使用OsCache可以专门使用几台机器专门管理cache,收到使用广播的方式发送到其他服务器。

多台服务器运行,索引只建立在一个机器上,如何让索引在不同服务器间共享。

必须采用分布式。这个时候最好使用ejb

建立一个无状态bean

把索引和jboss在一台服务器上。这个时候就查询这台jboss所在的服务器,这个bean就在这个机器上查询索引,所有的查询请求都发送到这个ejb的这个bean的方法处理。

这个方案牵扯到索引的建立,牵扯到一个事务的问题。要保证compass的事务和ejb的事务要一起做。

目前compass文档中有spring+compass的方案,但是ejb+compass的方案没有提到。事务如何保证控制在一起是个问题。

如果再被问到:当作为ejb服务器的jboss服务器本身也需要分布式该怎么办?

这个时候就回答jboss本身可以配置“集群”,具体的做法不清楚。

你可能感兴趣的:(jsp,应用服务器,jboss,cache,ejb)