上一节。简介了怎样发现性能瓶颈。从这节開始。我会和大家分享我在项目中做的一些性能调优工作。这个系列没有什么顺序可言,认为什么重要。就说说什么。

这节。我们聊缓存。



最開始接触缓存这个词,是学习硬件知识的时候,cpu有缓存,并且还分一级缓存,二级缓存。三级缓存。、

记得以前的以前老师提了一个非常有意思的问题。

问:电脑为什么要有一级缓存,二级缓存……,并且还要有内存,还要有硬盘?

假设你面对这个问题,你怎么回答?

先来看我们的正文,最后再解释。

我们要聊当然不是硬件意义上的缓存,而是应用程序与应用程序之间。或者应用程序与物理资源之间的缓存。

目的是,降低数据訪问的频次,从而提高性能。

缓存的介质通常是内存。所以读写速度非常快。

但假设缓存中存放的数据量非常大时。也会用硬盘作为缓存介质。缓存的实现不只要考虑存储的介质,还要考虑到管理缓存的并发訪问和缓存数据的生命周期。

近期做的TGB项目。我们做了双方面处理:

第一、开启Hibernate二级缓存;



我们系统使用的是JPA,没关系,Hibernate就是JPA的一种实现。我们恰恰是採用了这样的实现。

Hibernate提供了两级缓存,第一级是Session的缓存。因为Session对象的生命周期通常相应一个数据库事务或者一个应用事务,因此它的缓存是事务范围的缓存。第一级缓存是必需的。不同意并且其实也无法比卸除。在第一级缓存中,持久化类的每一个实例都具有唯一的OID。

第二级缓存是一个可插拔的的缓存插件,它是由SessionFactory负责管理。因为SessionFactory对象的生命周期和应用程序的整个过程相应。因此第二级缓存是进程范围或者集群范围的缓存。

这个缓存中存放的对象的松散数据。

第二级对象有可能出现并发问题。因此须要採用适当的并发訪问策略,该策略为被缓存的数据提供了事务隔离级别。缓存适配器用于把详细的缓存实现软件与Hibernate集成。第二级缓存是可选的。能够在每一个类或每一个集合的粒度上配置第二级缓存。

中间提到几个术语。不解释。百度百科吧。

Hibernate的二级缓存策略的一般步骤例如以下:

  1、 条件查询的时候,总是发出一条select * from table_name where …. (选择全部字段)这种SQL语句查询数据库。一次获得全部的数据对象。

  2、把获得的全部数据对象依据ID放入到第二级缓存中。

  3、当Hibernate依据ID訪问数据对象的时候,首先从Session一级缓存中查;查不到,假设配置了二级缓存,那么从二级缓存中查。查不到,再查询数据库,把结果依照ID放入到缓存。

  4、删除、更新、添加数据的时候,同一时候更新缓存。

  Hibernate的二级缓存策略,是针对于ID查询的缓存策略,对于条件查询则毫无作用。为此,Hibernate提供了针对条件查询的Query缓存。

  

Hibernate的Query缓存策略的步骤例如以下:



  1、Hibernate首先依据这些信息组成一个Query Key,Query Key包含条件查询的请求一般信息:SQL, SQL须要的參数,记录范围(起始位置rowStart,最大记录个数maxRows),等。

  2、Hibernate依据这个Query Key到Query缓存中查找相应的结果列表。假设存在,那么返回这个结果列表。假设不存在。查询数据库。获取结果列表,把整个结果列表依据Query Key放入到Query缓存中。

  3、Query Key中的SQL涉及到一些表名。假设这些表的不论什么数据发生改动、删除、添加等操作,这些相关的Query Key都要从缓存中清空。

用了这么长时间,感觉查询缓存作用不大,命中率太低。适合在查询条件固定的地方加入。

怎样开启?太简单。不讲。

第二、在远程调用client加了一层缓存。在服务端加了一层缓存。



使用AOP。我们写了一些Interceptor。缓存一些常常使用的查询条件。即相应的数据。

思路非常easy:

1、给EJB的实现类加入拦截器

2、拦截器推断查询方法的返回值是否已在缓存中,假设在则直接返回。否则调用EJB的方法。并将返回值放到缓存中,然后将结果返回

你可能要问。数据同步的问题。你是怎样解决的?

当EJB运行了增删改方法后,缓存中的数据就变成了脏数据。须要清空缓存

相同是用一个拦截器来解决,不同的是。这个拦截器是加入在EJB增删改方法上的

牵扯到跨系统调用。A系统怎样告诉B系统。你须要的数据已经改了,你要清理自己本地的缓存了呢?

1、在系统A创建一个JMS Topic。起名CacheTopic

2、当系统A运行增删改方法后。向CacheTopic中发一条消息,告诉他,数据改了,要清缓存了。

3、在系统B在自己的server中部署Message Driven Bean。监听CacheTopic中的消息,收到消息后清空本地缓存


另外,对于特别经常使用的Webservice调用,我们会把其代理对象缓存起来。不用每次都去解析wsdl,动态生成。

回到文章开头的那个问题。

我的回答是:提高数据交换速度等等一堆。

但老师就一句话:性价比,这就是商业。

细致琢磨一下,发现自己还是太嫩了。假设不过为了提快速度,干脆都用一级缓存算了,为什么不用?性价比,钱!

相同的道理。既然缓存能够提高效率,我们把系统全部用到查询的地方都用上缓存吧。

错,缓存假设乱用,事半功倍。有些数据常常改动。有些数据八百年也不查一回,有些数据跟钱有关系,不容有不论什么闪失,等等,这些数据,加缓存,纯粹是费力不讨好。非常少改动的数据,同意偶尔并发或者不会被并发訪问(改动)的数据,一些不是非常重要的数据,等等。就能够尝试加缓存。

开篇之所以说这个小故事。是为了提醒大家不要进入思维里的想当然,要权衡利弊看得失。

性能上有说不完的话题,下节,我们接着聊。

版权声明:本文博客原创文章。博客,未经同意,不得转载。

《java系统性能优化》--2.高速缓存的更多相关文章

  1. Java 程序优化 (读书笔记)

    --From : JAVA程序性能优化 (葛一鸣,清华大学出版社,2012/10第一版) 1. java性能调优概述 1.1 性能概述 程序性能: 执行速度,内存分配,启动时间, 负载承受能力. 性能 ...

  2. 《java系统性能调优》--1.发现瓶颈

    性能啊!性能! 之所以想写写性能调优,也是有感于我们的项目,我们採用一些手段使得系统性能上升了一个台阶,总是须要把这点经验沉淀一下.随着工作的深入,关于系统性能的事肯定还有非常多,也算是通过这个系列文 ...

  3. 《Java性能优化权威指南》

    <Java性能优化权威指南> 基本信息 原书名:Java performance 原出版社: Addison-Wesley Professional 作者: (美)Charlie Hunt ...

  4. 推荐:Java性能优化系列集锦

    Java性能问题一直困扰着广大程序员,由于平台复杂性,要定位问题,找出其根源确实很难.随着10多年Java平台的改进以及新出现的多核多处理器,Java软件的性能和扩展性已经今非昔比了.现代JVM持续演 ...

  5. JAVA性能优化的五种方式

    一,JAVA性能优化之设计优化 设计优化处于性能优化手段的上层.它往往须要在软件开发之前进行.在软件开发之前,系统架构师应该就评估系统可能存在的各种潜在问题和技术难点,并给出合理的设计方案,因为软件设 ...

  6. Java 性能优化之 String 篇

    原文:http://www.ibm.com/developerworks/cn/java/j-lo-optmizestring/ Java 性能优化之 String 篇 String 方法用于文本分析 ...

  7. java 性能优化(代码优化)

    参考博文: java 性能优化:35 个小细节,让你提升 java 代码的运行效率

  8. 读书笔记系列之java性能优化权威指南 一 第一章

    主题:java性能优化权威指南 pdf 版本:英文版 Java Performance Tuning 忽略:(0~24页)Performance+Acknowledge 1.Strategies, A ...

  9. [原创]Java性能优化权威指南读书思维导图

    [原创]Java性能优化权威指南读书思维导图 书名:Java性能优化权威指南 原书名:Java performance 作者: (美)Charlie Hunt    Binu John 译者: 柳飞 ...

随机推荐

  1. 腾讯2014在广州站实习生offer经验(TEG-开发背景)

    研究在过去的一年是linux 什么系统编程和网络编程.比较熟悉的语言c/c++,python只写一些测试client.是后台开发类,比方前面笔面的网易CC(面完hr后挂).大概3月15号就在腾讯 jo ...

  2. OpenCV(C++接口)学习笔记1-图像读取、显示、保存

    OpenCV在2.0加入版本号之后C++接口函数,学习前C语言的接口功能.现在OpenCV它已被发展到2.4.9版本号,所以,我决定学习C++接口函数,与步伐. 1.创建图像 cv::Mat imag ...

  3. T-SQL技巧收集——拆分字符串

    原文:T-SQL技巧收集--拆分字符串 在开发中,很多时候都需要处理拆分字符串的操作.下面收集了几种方法供大家分享,其中的逗号可以改为多种有需要的符号,但是不能针对多种符号同时存在的例子.有待各位补充 ...

  4. Codeforces Round #267 (Div. 2) A

    题目: A. George and Accommodation time limit per test 1 second memory limit per test 256 megabytes inp ...

  5. android4.4组件分析--service组件-bindService源代码分析

    6.1.1.    bindService 由于有前面分析startService的代码实现过程,则对于bindService的代码分析就不用那么具体介绍,在介绍流程的同一时候更关注一些细节上的部分. ...

  6. opengl编程指南

    第一章 opengl简单介绍 1.1 什么是opengl opengl是图形硬件的一种软件接口.        1>渲染(rendering)是计算机依据模型创建图像的过程. 2>模型(m ...

  7. struts.xml在Action配置具体解释

    在博客上我已经基本上解释struts.xml基本配置.配置过程最为基本的是action的动态配置. 一.Action的创建方法 1)实现Action接口 2)继承ActionSupport类,覆写当中 ...

  8. Youtube最佳Red5 官方视频下载指南,字幕【亲测成功】

    前言 最近在研究Red5 流媒体服务框架,官网上的信息足以让一个新手入门 有官方參考手冊 -- 高速了解red5的相关信息 有Red5 on Stackoverflow  -- 在上面能够提问或者回答 ...

  9. ubuntu12.04 残疾人游客

    为了防止陌生人登录你的ubuntu系统.例如,下面的方法,可以采用禁用 游客登录. sudo vi /etc/lightdm/lightdm.conf 在 lightdm.conf 文件末尾加入上 a ...

  10. CSS hack方式

    史上最全的CSS hack方式一览   做前端多年,虽然不是经常需要hack,但是我们经常会遇到各浏览器表现不一致的情况.基于此,某些情况我们会极不情愿的使用这个不太友好的方式来达到大家要求的页面表现 ...