- 浏览: 680579 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (302)
- 知识库 (51)
- lucene (8)
- 数据结构 (7)
- 问题及解决方法 (97)
- Quartz (4)
- JavaScript (26)
- java 基础 (40)
- 休闲 (9)
- 数据库相关 (32)
- 面试题 (4)
- Hibernate (5)
- Struts (11)
- JBPM (2)
- Spring (3)
- ajax (7)
- Flex (0)
- 报表 (4)
- 打印 (2)
- prototype (3)
- Struts2 (3)
- JQUERY (4)
- Ruby (0)
- Linux (9)
- Android (3)
- Objective-c (2)
- Python (8)
- map (1)
- mybatis (3)
- php (2)
- ios (0)
- 问题及解决方法 struts2 spring ognl resion tomcat (0)
- 问题及解决方法 struts2 spring ognl resin tomcat (1)
- c++ (2)
- 问题及解决方法 upload.parseRequest(request) 为空 (1)
- Eclipse maven tomcat (1)
- 知识库 服务器配置 (1)
- sersync2 (1)
- Maven Jetty Plugin 配置指南(翻译) (1)
最新评论
-
jgroups:
...
遇到Causedby:java.lang.NoClassDefFoundError:javax/validation/ParameterNameProvider -
dmyccc:
第二种方法还是很佩服楼主的,但是多少感觉有点投机取巧了。但是确 ...
spring mvc整合kindeditor文件上传问题 -
du_bo:
在xx-servlet.xml中这样配置<bean id ...
spring mvc整合kindeditor文件上传问题 -
java梦之翼:
太感谢了, 问题得到解决, 感谢
异常org.mybatis.spring.transaction.SpringManagedTransactionFactory.newTransaction -
du_bo:
这是我的上传package com.sp.controller ...
spring mvc整合kindeditor文件上传问题
四、demo
一、对象缓存
1、Cache操作类
import java.util.Date;
import com.opensymphony.oscache.base.NeedsRefreshException;
import com.opensymphony.oscache.general.GeneralCacheAdministrator;
public class BaseCache extends GeneralCacheAdministrator {
private int refreshPeriod; //过期时间(单位为秒);
private String keyPrefix; //关键字前缀字符;
private static final long serialVersionUID = -4397192926052141162L;
public BaseCache(String keyPrefix,int refreshPeriod){
super();
this.keyPrefix = keyPrefix;
this.refreshPeriod = refreshPeriod;
}
//添加被缓存的对象;
public void put(String key,Object value){
this.putInCache(this.keyPrefix+"_"+key,value);
}
//删除被缓存的对象;
public void remove(String key){
this.flushEntry(this.keyPrefix+"_"+key);
}
//删除所有被缓存的对象;
public void removeAll(Date date){
this.flushAll(date);
}
public void removeAll(){
this.flushAll();
}
//获取被缓存的对象;
public Object get(String key) throws Exception{
try{
return this.getFromCache(this.keyPrefix+"_"+key,this.refreshPeriod);
} catch (NeedsRefreshException e) {
this.cancelUpdate(this.keyPrefix+"_"+key);
throw e;
}
}
}
2、Cache管理类
public class CacheManager {
private BaseCache newsCache;
private static CacheManager instance;
private static Object lock = new Object();
private CacheManager() {
//这个根据配置文件来,初始BaseCache而已;
newsCache = new BaseCache("news",120);
}
public static CacheManager getInstance(){
if (instance == null){
synchronized( lock ){
if (instance == null){
instance = new CacheManager();
}
}
}
return instance;
}
public void putUser(User news) { newsCache.put(news.getId()+"",news); }
public void removeUser(String newsID) { newsCache.remove(newsID); }
public User getUser(int newsID) {
try {
return (User) newsCache.get(newsID+"");
} catch (Exception e) {
System.out.println("getNews>>newsID["+newsID+"]>>"+e.getMessage());
User news = new User(newsID);
this.putUser(news);
return news;
}
}
public void removeAllNews() {
newsCache.removeAll();
}
}
3、对象Bean
public class User {
private int id;
private String name;
private String sex;
private int age;
private Date accessTime; public User(int id) {
super();
this.id = id;
this.accessTime = new Date(System.currentTimeMillis());
}
public String toString() {
return "User info is : id=" + id + " accessTime="
+ accessTime.toString();
}
public User(String name, String sex, int age) {
super();
this.name = name;
this.sex = sex;
this.age = age;
}
public User() {
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Date getAccessTime() {
return accessTime;
}
public void setAccessTime(Date accessTime) {
this.accessTime = accessTime;
}
}
4、测试类
public class TestObjectCache {
public static void main(String[] args) {
CacheManager cm=CacheManager.getInstance();
TestObjectCache test=new TestObjectCache();
test.print(cm);
}
public void print(CacheManager cm){
User user=null;
for (int i = 0; i < 1000; i++) {
user=cm.getUser(100);
System.out.println("<<"+i+">>: "+user);
if(i==10){
//删除缓存id的对象
cm.removeUser(100+"");
}
if(i==20){
//删除所有缓存的对象
cm.removeAllNews();
}
// 睡眠部分
try {
Thread.sleep(30000);
} catch (Exception e) {
}
}
}
}
五、小结及引申
缓存是在提升系统响应时常用的一种技术,在系统缓存上通常采用的是有页面缓存、处理缓存和数据缓存这三种具体的类别,应该说这三种缓存在实现上还是稍有不同,尽管底层的缓存实现是一样的。
页面缓存
页面缓存是指对页面中的内容片断进行缓存的方案。比如页面中有一个部分是显示栏目中的内容的,那么就可以缓存这个部分,在进行第二次请求的时候就直接从缓存中取出这部分的内容(其实就是这部分的html了),这种情况下,缓存的作用其实非常明显,在典型的action+service+dao这样的结构中,在采用页面缓存后就意味着不需要经过action、service、dao这些层次的处理了,而是直接就返回了,对于系统响应速度的提升来说是非常明显的。
页面缓存通常采用oscache来进行实现,oscache提供了一个jsp tag,可通过这个tag来包含需要缓存的内容部分,当然,缓存的这个内容部分需要有对服务器的请求或逻辑计算等的,可想而知,去缓存一段静态html是没有意义的。
其次需要定义缓存的这段内容的key,例如我们要去缓存页面中某个栏目的某页的内容,对于这段内容而言唯一的key就是栏目ID以及当前页数,这样就组成了这段缓存的key了,其实这个部分看起来好像是很简单,但有些时候会很麻烦,要仔细的想清楚这段内容的唯一的标识的key到底是什么,^_^,通常的做法其实可以从action中需要获取的参数或service接口的参数来决定….
页面缓存中还需要做的一个步骤就是通知缓存需要更新,页面缓存和其他缓存稍有不同,需要告诉它,这个时候不能再使用缓存中的内容了,需要从后台再重新获取来生成新的缓存内容,这个其实很简单,因为很难在后台发生变化的时候自己来更新缓存的内容,只能是去通知它,然后让它再次发起请求来生成新的内容放入缓存中。
页面的缓存的使用对于系统的响应速度确实会有很大的提升,在实现页面缓存时最麻烦的主要是缓存的key的定义以及缓存更新的通知,缓存key的定义这个自然框架是没法解决的,不过缓存更新的通知其实在框架中可以考虑一种通知模型的,^_^,就像事件通知那样……..在实际的项目中,可以自己去实现一个这样的通知模型或者就是简单的采用单例方式来标识某个key是否需要更新。
页面缓存在实际的项目中使用非常的多。
处理缓存
处理缓存是指对于action、service、dao或者系统层次中的某方法进行缓存,说直接点,就是对某个类的某个方法的结果做缓存,这样在下次进行完全相同的请求的时候就可以直接取缓存了,这种响应速度的提升也是非常明显的。
处理缓存在现在的情况下其实采用任务的缓存工具包都可以实现,如oscache、ehcache、jbosscache等,但目前还没有处理缓存框架的出现,这个和处理缓存是否应该存在的意义也是有关系的,处理缓存框架要做到的其实就像拦截一样的方式,和oscache tag类似。
同样,处理缓存的麻烦也在于怎么样去定义这个key,很多情况下可以根据方法的输入作为key,方法的输出作为key的值,但也会有其他一些复杂的情况,这个时候定义key就会变得复杂些了。
处理缓存同样有通知更新缓存的情况,和页面缓存基本是一样的。
应该说,处理缓存和页面缓存非常的相似,从实现上来说基本是完全一致的,在使用上来讲处理缓存使用的好像不多。
数据缓存
数据缓存估计大家都很熟悉,就是对系统的数据进行缓存的方式,典型的就是Hibernate的一级、二级数据缓存。
数据缓存在实现上如果是用hibernate的话更多的是直接使用hibernate的一级、二级以及查询缓存,如果自己要实现的话可以去参考hibernate的实现机制。
数据缓存的key在一级、二级缓存中采用的都是数据的标识键的值的方式,查询缓存采用的是查询参数、查询语句的方式。
数据缓存的更新则是hibernate在进行存储时直接更新缓存的内容,而对于查询缓存则是采用全部直接清除的方式,这样在下次进行查询时自然会重新去查询,^_^,大家可能会想,为什么页面缓存和处理缓存不采用这样的方式来实现缓存的更新,稍微想想就知道了,在后台发生改变的时候其实是不知道需要移除哪些key的,所以hibernate为了避免这个麻烦,采用的就是当数据一旦发生改变的时候就清除全部的查询缓存,而不是只去清除相关的缓存,其实这里可以采用一种订阅式的模型,呵呵,当然,也增加了框架的复杂度。
数据缓存使用的应该是最多的,效果也是很明显的。
以上三种缓存是目前缓存实现时通常碰到的三种状况,里面按使用的多少来排序应该是:数据缓存、页面缓存和处理缓存;实现的难度上从难到易的顺序应该是:处理缓存、页面缓存、数据缓存;对于系统响应速度提升的效果来说从最好到好的顺序应该是:页面缓存、处理缓存、数据缓存。
六、一个典型应用场景
在SSH项目应用中,可以以对象的形式来缓存展现给用户的数据信息。对象的缓存要充分利用分组带来的好处(可以分组删除被缓存的对象),这样在执行数据库的CUD操作时,可以调用删除相应组别的缓存对象。
示例代码:
private CacheManager cm;
private final static String CACHE_KEY_SUB="RetJobs";
public JobAction() {
//获取缓存管理对象
cm = CacheManager.getInstance();
}
查询部分
page=(Page<RetJob>)(cm.get(CACHE_KEY_SUB+"_"+currentPage));
if(page==null){
//--------------------需要缓存对象部分-----------------------
page = retJobBaseModel.getJobs(currentPage, pageSize, statusCondition);
//-------------------------------------------
//缓存对象(含所属分组信息)
cm.put(page, CACHE_KEY_SUB+"_"+currentPage,new String[]{CACHE_KEY_SUB});
}
CUD操作部分
setCacheDisabled(CACHE_KEY_SUB);
private void setCacheDisabled(String group) {
//通过组别信息来删除缓存的对象。
cm.removeObjectByGroup(group);
}
CacheManager 类
public class CacheManager {
private BaseCache newsCache;
private static CacheManager instance;
private static Object lock = new Object();
private CacheManager() {
// 这个根据配置文件来,初始BaseCache而已;
newsCache = new BaseCache("hrms", 300);
}
public static CacheManager getInstance() {
if (instance == null) {
synchronized (lock) {
if (instance == null) {
instance = new CacheManager();
}
}
}
return instance;
}
public void put(Object news,String key,String[] groups) {
newsCache.put(key, news,groups);
}
public void remove(String key) {
newsCache.remove(key);
}
public Object get(String key) {
try {
return newsCache.get(key);
} catch (Exception e) {
return null;
}
}
public void removeAll() {
newsCache.removeAll();
}
public void removeObjectByGroup(String group){
newsCache.removeObjectByGroup(group);
}
}
BaseCache 类增加的2个方法如下:
// 添加被缓存的对象;
public void put(String key, Object value,String[] groups) {
this.putInCache(this.keyPrefix + "_" + key, value,groups);
}
//删除该组的缓存对象
public void removeObjectByGroup(String group){
this.flushGroup(group);
}
发表评论
-
redis 使用test
2014-04-05 12:21 1347package com.xxx.redis; impo ... -
The reference to entity "characterEncoding" must end with the ';' delimiter
2014-01-13 15:04 1066数据源配置时加上编码转换格式后出问题了: The r ... -
java 图片涂抹功能
2013-12-30 16:19 1494今天遇到一个问题,用户上传图片的时候,有些敏感信息 ... -
Sublime Text 2快捷键大全
2013-12-16 15:42 984快捷键: 说明 Ctrl+P: ... -
Maven Jetty Plugin 配置指南(翻译)
2013-10-26 13:20 1117Jetty 版本信息 J ... -
jdk 1.6 下载地址
2013-10-16 14:14 864https://jdk6.java.net/download. ... -
java 截取汉字字符串
2013-10-11 11:49 1420对于汉字的切分 1个 汉字 占用2个字符 不能切出半 ... -
sersync2 同步
2013-09-17 19:06 1488sersync2 实时同步 ... -
JSON和JSONP
2013-08-01 11:53 932由于Sencha Touch 2这种开 ... -
Nginx 配置文件详解
2013-07-30 20:17 1111Nginx 配置文件详解 user nginx ... -
Eclipse 运行 maven web 项目
2013-07-19 14:00 20669eclipse 运行 maven web 项目 有两种方 ... -
Python2.7 安装 beautifulsoup4-4.2.1
2013-07-15 11:53 3047一个BeautifulSoup的模块,下载的是bea ... -
Pytohon 安装 MySQLdb
2013-07-08 12:22 1319python 在windows 下安装 mysql ht ... -
通过maven在eclipse中直接关联源码包
2013-07-01 16:21 965通过maven在eclipse中直接关联源码包 1、使用命 ... -
unicode 和 汉字转换
2013-06-18 15:23 1515// unicode转为本地 public sta ... -
httpclient4 抓取 防盗链的图片
2013-05-17 15:18 1617写了一个爬虫需要抓取某个网站的相关信息,文字信息都没 ... -
myeclipse maven plugin 插件 安装 和 配置
2013-05-15 17:34 2845环境: ... -
gson 显示时间格式
2013-03-26 10:19 1267需要输出的json格式中的时间是格式化好的。 Gson g ... -
MyBatis 调用存储过程
2013-01-06 16:42 1536如果存储过程有返回值使用select标签 ... -
ognl.OgnlException: target is null for setProperty(null
2012-12-14 11:12 1193写的项目在本地运行一直运行在tomcat7 下面,自测没有问题 ...
相关推荐
### 二、OSCache文档 OSCache的官方文档提供了详细的使用指南、API参考和常见问题解答。文档通常包括以下几个部分: 1. **快速入门**: 教程性质的内容,引导开发者快速了解OSCache的基本用法。 2. **配置指南**: ...
本文将详细介绍 OSCache 的配置和使用方法。 **一、缓存整个页面** OSCache 提供了一个名为 `CacheFilter` 的过滤器,该过滤器用于实现页面级别的缓存。通过在 `web.xml` 文件中配置,我们可以指定哪些页面或一组...
本文档详细介绍了OSCache的配置与使用,旨在为开发者提供一份全面的参考指南。OSCache是由OpenSymphony开发的开源缓存框架,它为J2EE应用程序提供了高效、灵活的缓存解决方案。 文档介绍 文档目的: 本文档的主要...
<br/> }<br/><br/> }<br/> <br/>}<br/><br/><br/> 通过CacheManager类来看怎样缓存对象的,这个类中所用的News只是具体功能的类,我就不贴出来了,你可以自己写一个! view plaincopy to clipboardprint?package...
### 二、osCache 的主要功能 1. **不分页面缓存**:osCache 支持对对象级别的缓存,无论对象大小,都可以被缓存起来。这种模式适用于存储单个数据实体或复杂对象。 2. **整个页面缓存**:对于静态或者几乎不发生...
根据提供的信息,我们可以详细解析与OSCache相关的知识点。 ### OSCache简介 OSCache是一个高性能、易于使用的缓存组件,主要用于Web应用程序中数据的缓存管理。它可以极大地提高Web应用的性能,通过减少对数据库...
<filter-name>oscache</filter-name> <filter-class>com.opensymphony.oscache.web.filter.CacheFilter</filter-class> <init-param> <!--刷新缓存时间--> <param-name>time</param-name> <param-value>10</...
7. **动态映射**:利用`<if>`、`<choose>`、`<when>`、`<otherwise>`等标签,可以根据条件动态生成SQL语句,增强了SQL的灵活性。 8. **事务管理**:Ibatis支持基于JDBC和JTA的事务管理。默认情况下,它使用JDBC的...
### oscache文档知识点详解 #### 一、OSCache概述及特点 **OSCache**是由**OpenSymphony**设计的一种创新的JSP自定义标签库,主要用于实现现有JSP页面内部的快速内存缓存功能。作为一种广泛应用且高性能的J2EE缓存...
例如,你可以使用 `<select>`, `<insert>`, `<update>`, 和 `<delete>` 标签来定义 SQL 语句,而 `<parameterMap>` 和 `<resultMap>` 则用于描述参数和结果集的映射。 对于复杂的数据关联,Ibatis 提供了一对一、一...
OsCache2.3.2帮助文档(英文)
- **动态映射**:使用 `<if>`、`<choose>`、`<foreach>` 等元素构建动态 SQL 语句,提高代码复用性和灵活性。 #### iBATIS 高级特性 - **数据关联**:包括一对多和一对一关联,以及支持延迟加载,提高数据处理效率...
在提供的压缩包中,`oscache-2.4.1.jar`是osCache的二进制库文件,包含了所有必要的类和资源,可以直接引入到Java项目中使用。`docs`目录可能包含osCache的API文档,帮助开发者了解和使用各个类和方法。`src`目录...
- `docs`:文档目录,可能包括API文档、用户手册等,帮助开发者更好地理解和使用OSCache。 5. **配置与使用**: 开发者需要根据`etc`目录中的配置文件进行适当修改,以适应自己的应用环境。同时,需要在JSP页面中...
- **动态映射**:支持 SQL 语句的动态构建,例如使用 `<if>`、`<choose>` 等标签。 - **事务管理**: - **基于 JDBC 的事务管理**:适用于简单的事务处理。 - **基于 JTA 的事务管理**:适用于分布式事务。 - **...
4. **docs**:文档目录,一般包含API文档、用户手册或者开发者指南,帮助开发者理解osCache的使用方法、API接口和最佳实践。 5. **src**:源代码目录,如果提供的话,可以查看osCache的内部实现,这对于学习和调试...
1. **docs**: 包含osCache的文档,包括用户手册、API参考等,是学习和理解osCache功能的重要资源。 2. **src**: 源代码目录,提供了osCache的全部源代码,便于开发者深入研究和定制。 3. **www.pudn.com.txt**: ...