`

用CashFilter实现页面级缓存实践

阅读更多
1.mysql在本地localhost的test数据库 建person表,暂以字段id,name,password ,表中可输入一行值. 2.建类 DAOUtil import java.sql.Connection; import java.sql.DriverManager; public class DAOUtil { public DAOUtil() { }

 

 

1.mysql在本地localhost的test数据库 建person表,暂以字段id,name,password ,表中可输入一行值.

2.建类 DAOUtil

import  java.sql.Connection;
import  java.sql.DriverManager;

public class DAOUtil {
    public DAOUtil() {
    }

   public static Connection getConn() {
        Connection conn = null;
        String db_url = "jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=gb2312";
        String db_user = "root";
        String db_password= "admin";
        String db_driver = "com.mysql.jdbc.Driver";

        try {
            Class.forName(db_driver);
            conn = DriverManager.getConnection(db_url, db_user, db_password);
             } catch (Exception ex) {
             ex.printStackTrace();
        }
        return conn;
    }

  /**
  * dbclose
  * 关闭Connection,Statement
  * @param conn Connection
  * @param stmt Statement
  */
 public static void dbclose(Connection conn, Statement stmt) {
       try {
           if (stmt != null)
               stmt.close();
       } catch (Exception e) {
         e.printStackTrace();
       }
       try {
           if (conn != null)
               conn.close();
       } catch (Exception e) {
          e.printStackTrace();
       }
   }

}

3.建类 PersonDAO

import java.util.*;
import java.sql.Connection;
import java.sql.Statement;
import java.sql.ResultSet;


public class PersonDAO {
    static PersonDAO pdao;
    public static PersonDAO getInstance() {
        if (pdao == null) {
            synchronized (PersonDAO.class) {
                pdao = new PersonDAO();
            }
        }
        return pdao;
    }

    public PersonDAO() {
        super();    }

    public static void main(String[] args) {
          System.out.println("person==="+PersonDAO.getInstance().getPersonInfo());
    }
  
       private static List getPersonInfo() {
          String name  = "";
          String password = "";
          Connection conn = null;
          List list = new java.util.ArrayList();
          Statement stmt = null;
          String sql =
                  "select name,password from person";
          try {
              conn = DAOUtil.getConn();
              stmt = conn.createStatement();
              ResultSet rs = stmt.executeQuery(sql);
              while (rs.next()) {
                  name = (String)rs.getString("name");
                  password = (String)rs.getString("password");
                  list.add(name+","+password);
                 }
          } catch (Exception ex) {
              ex.printStackTrace();
               } finally {
              DAOUtil.dbclose(conn, stmt);
          }
          return list;
      } 
}

4.建testCache.jsp,testCache2.jsp

<%@page contentType="text/html; charset=GBK"%>
<%@page import="com.mcsky.dao.PersonDAO" session="false"%>
<%@page import="java.util.List" session="false"%>
<html>
<body bgcolor="#FFFFFF">
test ,hello world!!<p>
  <table width="85%" border="1" align="center">
   <tr>
      <td width="8%" height="20"> <div align="center">序号</div></td>
      <td width="12%"><div align="center">名字</div></td>
      <td width="17%"><div align="center">密码 </div></td>
       </tr>
<%
//todo connect mysql server (localhost root/admin) and test(db) person(table)
List list =PersonDAO.getInstance().getPersonInfo();
System.out.println("size==="+list.size());
for(int i=0;i<list.size();i++){
String namePass = (String)list.get(i);
java.util.StringTokenizer st = new  java.util.StringTokenizer(namePass,",");
String   name = st.nextToken();
String    pass = st.nextToken();
System.out.println("namePass+++++"+namePass);
%>
  <tr>
      <td><div align="center"><%=i+1%></div></td>
      <td> <div align="center"><%=name%></div></td>
      <td><div align="center"><%=pass%></div></td>
      </tr>
    <%
        }
%>
  </table>

</body>
</html>

5.把module部署在tomcat的webapp下

5.1 在WEB-INF\lib\log4j-1.2.8.jar,mysql-connector-java-3.0.11-stable-bin.jar,oscache-2.3.2.jar,commons-logging.jar,jgroups-all.jar

5.2 在WEB-INF\classes拷贝cach\etc\下的oscache.tld,oscache.properties

5.3 只对/testCache.jsp缓存

修改WEB-INF\web.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
  <display-name>test</display-name>
  <taglib><taglib-uri>oscache</taglib-uri><taglib-location>/WEB-INF/classes/ oscache.tld</taglib-location></taglib>
   <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>/testCache.jsp</url-pattern>
      </filter-mapping>
    
</web-app>

启动tomcat,在mysql的person中增加一条记录,发现已对/testCache.jsp页面进行缓存,而/testCache2.jsp页面未缓存,如去掉黑体,则数据表增加一行,testCache.jsp也随之修改

5.4对所有的jsp缓存,

修改WEB-INF\web.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
  <display-name>test</display-name>
      <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>session</param-value>
          </init-param>
          </filter>
          <filter-mapping>
          <filter-name>CacheFilter
          </filter-name>
            <url-pattern>*.jsp</url-pattern>
          </filter-mapping>
</web-app>

其中60s,是失效时间,在mysql的person中增加一条记录,发现已对/testCache.jsp,/testCache2.jsp页面进行缓存,页面不变化,60s后页面变化.终于

 

分享到:
评论

相关推荐

    Mybatis-plus基于redis实现二级缓存过程解析

    在本文中,我们将介绍如何使用Mybatis-plus基于Redis实现二级缓存过程解析。 首先,我们需要在application.properties或application.yml文件中配置Redis连接信息: ```properties redis: host: 39.104.203.155 ...

    redis页面缓存html使用redis实现页面缓存.docx

    使用 Redis 实现页面缓存 本文档主要介绍了使用 Redis 实现页面缓存的方法,包括缓存 key 的设计、缓存实现的思路和代码实现。 页面缓存的目的:页面缓存的主要目的是为了提高网站的访问速度和用户体验。通过将...

    深入理解MyBatis中的一级缓存与二级缓存

    `&lt;settings&gt; &lt;setting name="cacheEnabled" value="true"/&gt;&lt;/settings&gt;`,并在需要开启二级缓存的mapper.xml中加入 `&lt;cache/&gt;`标签,同时让使用二级缓存的POJO类实现Serializable接口。 一级缓存和二级缓存都是...

    springMybatis+redis三级缓存框架

    在实现二级缓存时,我们可以选择EhCache作为缓存实现,EhCache是一款广泛使用的Java缓存库,具有良好的性能和可扩展性。 然而,当系统负载高或者需要跨应用共享缓存时,内存缓存(如EhCache)可能无法满足需求,...

    Redis用作二级缓存

    3. 编写Mybatis的配置:在mybatis-config.xml文件中,启用全局的二级缓存并指定使用Redis作为缓存实现。 ```xml &lt;!-- Redis相关配置 --&gt; ``` 4. 定义Mapper缓存:在每个Mapper接口或XML配置文件...

    hibernate一级缓存和二级缓存的区别与联系

    二级缓存可以是内存中的缓存,也可以扩展到硬盘,例如使用第三方缓存提供商(如 EhCache 或者 Infinispan)。二级缓存中存储的是对象的集合数据,而不是单个对象实例,这样可以更高效地处理大量数据。二级缓存可以...

    hibernate一级缓存、二级缓存和查询缓存

    二级缓存的实现需要依赖第三方缓存提供者,如EhCache、Infinispan等。二级缓存的主要特点包括: - **跨事务共享**:与一级缓存不同,二级缓存可以在多个事务之间共享数据,提高了数据的复用性。 - **配置复杂**:二...

    mybatis+redis实现二级缓存

    在本项目中,“mybatis+redis实现二级缓存”是一个巧妙结合了MyBatis持久层框架与Redis内存数据库来优化数据访问速度的实践案例。下面将详细介绍这个项目中的关键技术点以及实现步骤。 首先,MyBatis是一个轻量级的...

    android图片二级缓存的实现机制

    本文将深入探讨“Android图片二级缓存的实现机制”,并结合开源项目Android-Universal-Image-Loader(UIL)的源码进行分析。 ### 一、什么是图片二级缓存 二级缓存是Android图片加载库常用的一种优化策略,它通常...

    Hibernate一级缓存、二级缓存以及查询缓存实例

    一级缓存提供事务级别的缓存服务,二级缓存实现跨Session的数据共享,查询缓存则针对重复查询进行优化。在实际开发中,我们需要根据业务需求和数据特性,灵活配置和管理这些缓存,以达到最佳的性能效果。

    Hibernat一级缓存(源码)

    3. 分布式缓存:在多节点环境中,可以考虑使用二级缓存(如 Ehcache 或 Infinispan)来实现跨节点的数据共享,提高系统性能。 总结: 一级缓存作为 Hibernate 的核心特性,极大地提高了数据访问效率。通过对源码的...

    day37 05-HIbernate二级缓存:一级缓存更新同步到二级缓存及二级缓存配置文件

    二级缓存通常由第三方缓存提供商如Ehcache、Infinispan等实现。 一级缓存到二级缓存的同步是自动进行的。当对象在一级缓存中被修改并提交后,Hibernate会根据配置将这些变化同步到二级缓存中。这个过程包括了更新、...

    mybatis一级缓存和二级缓存简单示例

    创建一个简单的 MyBatis 示例,包括一级缓存和二级缓存的使用: 1. 定义实体类 `User` 和对应的 `UserMapper` 接口。 2. 编写 `UserMapper.xml` 映射文件,开启二级缓存配置。 3. 在 Service 层中调用 `UserMapper`...

    MyBatis缓存(一级缓存、二级缓存)

    二级缓存的实现基于MyBatis的插件体系,可以通过配置启用并指定实现类,如 EhCache 或 Redis。 启用二级缓存需要在MyBatis的配置文件中开启缓存支持,并在对应的Mapper接口或XML配置中声明启用二级缓存。每个Mapper...

    Hibernate一级缓存和二级缓存

    Hibernate的一级缓存和二级缓存是提高数据访问效率的重要手段,它们各自承担着不同的角色,合理使用可以显著提升应用性能。然而,缓存的使用也需要谨慎,需要根据具体业务场景选择合适的缓存策略,并关注可能带来的...

    hibernate一级和二级缓存配置与详解

    本篇将深入探讨Hibernate的一级缓存和二级缓存,以及查询缓存的配置和使用。 ### 一级缓存 一级缓存是Hibernate默认提供的缓存,它是Session级别的,每个Hibernate Session都有一个私有的、本地的一级缓存。当我们...

    hibernate二级缓存实例

    二级缓存的实现主要依赖于插件,如Ehcache、Infinispan等。以Ehcache为例,它是Hibernate常用的一种二级缓存解决方案,提供了内存和磁盘两层缓存,支持自动过期策略,确保数据的实时性。 配置二级缓存主要包括以下...

    spring + ehcache + redis两级缓存

    在Spring中,可以通过`RedisTemplate`或`StringRedisTemplate`来操作Redis,并配置`@EnableCaching`中的`CacheResolver`和`CacheManager`以使用Redis作为二级缓存。 3. **实现缓存策略**: 缓存策略决定了何时从...

    hibernate的一级缓存和二级缓存

    二级缓存的实现通常由第三方插件提供,如Ehcache或Infinispan,Hibernate通过CacheProvider接口进行集成。二级缓存需要提供并发访问策略以确保事务隔离级别,同时也需要设定数据过期策略,如最大内存数量、存活时间...

    android图片下载LruCache实现三级缓存方式

    "android图片下载LruCache实现三级缓存方式"是一个典型的图片加载优化实践,它涉及到内存缓存、外部存储(如SD卡)缓存以及网络缓存三个层次。下面我们将详细探讨这一技术。 首先,LruCache是Android SDK提供的一种...

Global site tag (gtag.js) - Google Analytics