代码片段三:使用软引用构建敏感数据的缓存
2012-07-31 14:33
483 查看
public class Employee { private String id;// 雇员的标识号码 private String name;// 雇员姓名 private String department;// 该雇员所在部门 private String Phone;// 该雇员联系电话 private int salary;// 该雇员薪资 private String origin;// 该雇员信息的来源 // 构造方法 public Employee(String id) { this.id = id; getDataFromlnfoCenter(); } // 到数据库中取得雇员信息 private void getDataFromlnfoCenter() { // 和数据库建立连接井查询该雇员的信息,将查询结果赋值 // 给name,department,plone,salary等变量 // 同时将origin赋值为"From DataBase" } ……
import java.lang.ref.ReferenceQueue; import java.lang.ref.SoftReference; import java.util.Hashtable; public class EmployeeCache { static private EmployeeCache cache;// 一个Cache实例 private Hashtable employeeRefs;// 用于Cache内容的存储 private ReferenceQueue q;// 垃圾Reference的队列 // 继承SoftReference,使得每一个实例都具有可识别的标识。 // 并且该标识与其在HashMap内的key相同。 private class EmployeeRef extends SoftReference { private String _key = ""; public EmployeeRef(Employee em, ReferenceQueue q) { super(em, q); _key = em.getID(); } } // 构建一个缓存器实例 private EmployeeCache() { employeeRefs = new Hashtable(); q = new ReferenceQueue(); } // 取得缓存器实例 public static EmployeeCache getInstance() { if (cache == null) { cache = new EmployeeCache(); } return cache; } // 以软引用的方式对一个Employee对象的实例进行引用并保存该引用 private void cacheEmployee(Employee em) { cleanCache();// 清除垃圾引用 EmployeeRef ref = new EmployeeRef(em, q); employeeRefs.put(em.getID(), ref); } // 依据所指定的ID号,重新获取相应Employee对象的实例 public Employee getEmployee(String ID) { Employee em = null; // 缓存中是否有该Employee实例的软引用,如果有,从软引用中取得。 if (employeeRefs.containsKey(ID)) { EmployeeRef ref = (EmployeeRef) employeeRefs.get(ID); em = (Employee) ref.get(); } // 如果没有软引用,或者从软引用中得到的实例是null,重新构建一个实例, // 并保存对这个新建实例的软引用 if (em == null) { em = new Employee(ID); System.out.println("Retrieve From EmployeeInfoCenter. ID=" + ID); this.cacheEmployee(em); } return em; } // 清除那些所软引用的Employee对象已经被回收的EmployeeRef对象 private void cleanCache() { EmployeeRef ref = null; while ((ref = (EmployeeRef) q.poll()) != null) { employeeRefs.remove(ref._key); } } // 清除Cache内的全部内容 public void clearCache() { cleanCache(); employeeRefs.clear(); System.gc(); System.runFinalization(); } }
相关文章推荐
- Java系列:使用软引用构建敏感数据的缓存
- 使用软引用构建敏感数据的缓存
- 03_MyBatis基本查询,mapper文件的定义,测试代码的编写,resultMap配置返回值,sql片段配置,select标签标签中的内容介绍,配置使用二级缓存,使用别名的数据类型,条件查询ma
- 03_MyBatis基本查询,mapper文件的定义,测试代码的编写,resultMap配置返回值,sql片段配置,select标签标签中的内容介绍,配置使用二级缓存,使用别名的数据类型,条件查询ma
- 利用XML缓存数据达到缓解数据库服务器压力的代码利用片段
- [翻译] 编写高性能 .NET 代码--第二章 GC -- 减少大对象堆的碎片,在某些情况下强制执行完整GC,按需压缩大对象堆,在GC前收到消息通知,使用弱引用缓存对象
- 今日内容介绍 1、自定义类型的定义及使用 2、自定义类的内存图 3、ArrayList集合的基本功能 4、随机点名器案例及库存案例代码优化 ###01引用数据类型_类 * A: 数据类型
- Android获取各个应用程序的缓存文件代码小片段(使用AIDL)
- android使用软引用构建缓存
- 使用EnterpriseLibrary5实现数据的缓存(附完整代码下载)
- 使用软引用构建缓存
- 使用软引用构建缓存(转载)
- android使用软引用构建缓存
- 使用软引用构建缓存
- 数据缓存——LKDBHelper的使用
- Android清除本地数据缓存代码
- Zend Framework 开发记录 - 代码片段–Zend_Table如何使用Join,还有group
- 《论不使用ObjectDataSource之数据绑定控件纯代码实现是否更优化? 》补记
- WPF中如何使用代码操作数据模板生成的控件
- 引用 MySQL使用基于Parameter方式代码,总是提示:“Column '列名' cannot be null”