一。缓存过滤器模式
1。概念:缓存过滤器模式是通过使用servlet的filter来动态地缓存生成的页面,从而提高web层的性能和伸缩性。工作原理非常简单,当第一次请求到来时,判断是否可以缓存,可以的话就放在缓存里。当下次请求时,直接从缓存中取出,而不是再次请求。
2。一个简单实现对html页面的缓存:
package cfexample.controller;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
/** *//**
*用来替代HttpServletReponse的新对象,以提供缓存能力
*/
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请求的内容
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);
}
}
//判断是否可以缓存,考虑一个配置文件配置哪些可以缓存,此处省去
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.实际应用例子:oscache是很好的解决web层缓存的方案!!准备认真读读它的源代码。
二。资源池模式:
1。概念:一个资源池就是一组预先生成的对象,它们可以被出借以便节省多次chuang创建它们所花费的时间。典型的如:EJB池(Service Locator一般都有一个ejb的home接口池),数据库连接池。
2。优点:A。提高了应用的可伸缩性,使资源的创建和开销不至于失控。B,产生了一个统一的有效微调点,通过运行时修改池参数来影响应用的性能等因素。
3。简单实现:
(1)首先一个创建对象的工厂:
package pool;
public interface ResourceFactory {
public Object createResource();
//验证返回的资源,并提供还原
public boolean validateResource(Object o);
} (2)资源池:
分享到:
相关推荐
SSM框架,全称为Spring、SpringMVC和MyBatis的...综上所述,这个项目是一个完整的Java Web解决方案,通过整合SSM、Shiro和Redis,实现了权限控制、高效缓存和稳定的数据访问,是学习和实战企业级应用开发的宝贵资源。
但分布式环境下的缓存管理面临新的挑战,如数据访问的弱局部性可能导致缓存污染,大粒度的缓存管理会消耗大量网络带宽和磁盘IO资源,而且缓存层和存储层的数据冗余会增加开销。 为此,本文提出了一种名为HOSD(Hot ...
3. 缓存控制:根据策略决定是否从缓存中返回响应,减少服务器压力。 4. 安全过滤:比如URL编码、XSS防护、CSRF防范等。 5. 语言/字符集转换:确保客户端和服务器之间的数据传输一致性。 接下来,我们来看看Listener...
本资源包含的是Druid连接池工具类以及相关的jar包,这些jar包对于配置和使用Druid连接池至关重要。 首先,让我们详细了解一下Druid连接池的基本概念。数据库连接池在初始化时会创建一定数量的数据库连接,并将其...
- **高性能**: Druid通过预读取、缓存以及空闲连接检测等机制,确保了高效的数据库连接管理。 - **监控**: 内置的WebStatFilter可以实时监控数据库连接池的状态,包括SQL执行情况、连接使用情况等。 - **SQL解析*...
在PassThru模式下,Filter驱动需要正确处理这些步骤,确保数据包能够顺利通过并实现预定的功能。 #### 4. WinDBG+VMware=调试内核 - **WinDBG**:一种广泛使用的调试工具,可以用来调试用户模式和内核模式的应用...
- **高性能**:Druid通过一系列优化策略,如Statement缓存、连接池预热等,实现了比其他连接池更高的性能。 - **监控与扩展性**:内置了丰富的监控统计功能,可以方便地集成到Spring MVC或者Servlet Filter中,...
数据库连接是非常宝贵的资源,频繁创建和关闭会消耗大量系统资源。Druid通过维护一个连接池,提供高效的连接复用,从而提高系统性能。它支持基本的数据库连接池功能,如连接创建、分配、回收和检测等。 在设计上,...
Druid连接池是阿里巴巴开源的一款高性能数据库连接池组件,版本1.1.10在众多项目中广泛使用并受到良好的反馈。这个组件的核心目标是提供监控、扩展性和性能优化的数据库连接管理服务。以下是对Druid连接池1.1.10版的...
JAVAEE 快速自学路线及详细的学习资源和方法 本资源摘要信息旨在提供 JavaEE 的快速自学路线,涵盖了从零基础到 JavaEE 就业的所有知识点。该路线图分为六个模块,每个模块都提供了学习书籍和视频资源,学习者可以...
- **DruidDriver作为ProxyDriver:**即使不使用Druid作为主连接池,也可以通过DruidDriver将内置的Filter应用到其他连接池中,只需调整JDBC URL即可。 **三、Druid的SQL解析能力** - **高性能SQLParser:**Druid...
它主要用于管理和复用数据库连接,避免每次请求都创建新的连接,从而减少资源消耗和提高系统性能。常见的连接池实现有Apache的DBCP、C3P0和HikariCP等。连接池通过预配置一定数量的连接,使得应用程序能够快速获取并...
Druid数据库连接池是阿里巴巴开源的一款高效、强大的数据库连接池组件,它在Java应用程序中用于管理数据库连接,提高数据库访问性能并优化资源利用。这个压缩包包含`druid-1.1.22.jar`和`druid.properties`两个文件...
- 连接池管理:合理配置连接池大小,避免资源浪费和连接溢出。 - 数据结构选择:根据业务场景选择合适的Redis数据结构,如字符串、哈希、列表、集合和有序集合,以提高操作效率。 - 避免阻塞操作:尽量使用非阻塞...
例如,通过调整连接池参数来平衡连接使用率和响应速度,或者开启PreparedStatement缓存来提高执行效率。 总的来说,自定义的Druid资源包可能是为了满足特定项目对数据库连接管理的特殊需求,它可能包含了特定的配置...
在配置中,`<context:component-scan>`标签用于扫描并自动管理Bean,而`<context:exclude-filter>`则用于排除特定类型的Bean,例如@Controller注解的控制器。 2. **Spring 3.1.1**:Spring作为整体框架,除了...
合理的权限设计可以有效防止未授权用户访问敏感资源。 - **权限定义**:权限组通常是按照角色来划分的,每个角色都有一系列相关的权限。 - **权限拦截模块**:分为粗粒度(Filter)和细粒度(AOP)两种。其中,...
在Servlet 2.3及以上版本中,可以通过实现`javax.servlet.Filter`接口创建自定义过滤器,并在`Web.xml`中配置,确保在每次请求时调用过滤器以清除缓存头信息,防止敏感内容被保存在客户端。 此外,文中提到了J2EE...
2. **资源初始化和销毁**:ServletContextListener可以在应用启动和停止时执行初始化和清理工作,如加载配置文件、初始化数据库连接池等。 3. **数据缓存**:监听器可以监控特定对象的变化,及时更新缓存,保持数据...