有的人很奇怪,Hibernate已经为我们提供了良好的缓存机制,还有必要在应用程序的层面上进行缓存吗?这就好比CPU已经有了一级缓存,还要给它来个二级缓存,甚至还需要硬盘的缓存,光驱的缓存,总之,缓存无所不在,它们通常是比父一级的缓存机制更有针对性,更富有效率。
和大多数人一样,不喜欢写太多的注释。下面的几个类要简单说明一下,其中的Department、Menu、Role等是几个被缓冲的类, CommonDao和PersistenceService是被封装的Hibernate数据操作类。在这里,CommonDao实例主要用来读数据, PersistenceService实例主要用来进行持久化。
接下来就看看它是怎么实现的吧,有问题请大家多多指点。
java 代码
-
-
-
- //package com.company.project;
-
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
-
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
-
- import com.etong.common.persistence.CommonDao;
- import com.etong.system.domain.Menu;
- import com.etong.system.domain.Role;
- import com.etong.system.service.PersistenceService;
- import com.etong.system.service.ServiceFactory;
-
-
- * Title: Hibernate的一个读写缓冲代理
- * Description: 一个CommonDao和PersistenceService代理,
-
- * Copyright: Copyright (c) 2006
- * Company: ××信息技术有限公司
- * Created on Jun 16, 2006
-
-
-
-
- public class HibernateBuffer {
-
- private static final Log log = LogFactory.getLog(HibernateBuffer.class);
-
- private static long count;
- private static HibernateBuffer cache = null;
- private CommonDao cdao = CommonDao.getInstance();
- private PersistenceService ps = ServiceFactory.createPersistenceService();
-
- private int objCount;
- private boolean[] listChanged;
- private Map cachedIndex;
- private Map[] objMap;
- private List[] objList;
-
-
-
-
- private Class[] objClass = {
- Menu.class,
- Role.class,
-
Department.class
- };
-
- private String[] getIDMethod = {
- "getMenuID",
- "getRoleID",
- "getDeptId"
- };
-
-
-
-
- private HibernateBuffer(){
- count = 0;
- objCount = objClass.length;
- listChanged = new boolean[objCount];
- cachedIndex = new HashMap();
- objMap = new HashMap[objCount];
- objList = new ArrayList[objCount];
-
- for(int i=0;i
-
- cachedIndex.put(objClass[i],i);
- objList[i] = cdao.findPersistenceObjects(objClass[i]);
- objMap[i] = new HashMap();
- int size = objList[i].size();
- for(int j=0;j
- Object obj = objList[i].get(j);
- try {
- Object objID = obj.getClass().getMethod(getIDMethod[i],
- new Class[0]).invoke(obj,new Object[] {});
- objMap[i].put(objID, obj);
- }catch(Exception e) {
- String msg = "注册类" + objClass[i].getName() + "的方法" + getIDMethod[i] +
- "()调用时产生异常,可能是方法不存在或参数有误。";
- log.error(msg, e);
- throw new RuntimeException(msg);
- }
- }
- listChanged[i] = false;
- }
- if(log.isInfoEnabled()) {
- StringBuffer info = new StringBuffer("已缓冲的类有:\n");
- for(int i=0;i
- info.append("\t\t");
- info.append(objClass[i].getName());
- }
- log.info(info);
- }
- }
-
-
-
-
-
- public static HibernateBuffer getInstance() {
- if(cache==null) {
- cache = new HibernateBuffer();
- }
- if(log.isDebugEnabled()) {
- log.debug("HibernateBuffer产生了第" + (++count) + "个共享实例");
- }
- return cache;
- }
-
- private int getIndexByClass(Class cls) {
- Object value = cachedIndex.get(cls);
- if(value==null)return -1;
- return ((Integer)value).intValue();
- }
-
-
-
-
-
-
-
- public Object findPersistenceObjByID(Class cls, Long id) {
- int index = getIndexByClass(cls);
- if(index<0)return cdao.findPersistenceObjByID(cls,id);
- return objMap[index].get(id);
- }
-
-
-
-
-
-
-
- public Object getPersistenceObjByID(Class cls, Long id) {
- int index = getIndexByClass(cls);
- if(index<0)return cdao.getPersistenceObjByID(cls, id);
- try {
- return objMap[getIndexByClass(cls)].get(id);
- }catch(Exception e) {
- return null;
- }
- }
-
-
-
-
-
-
- public List findPersistenceObjects(Class cls) {
- int index = getIndexByClass(cls);
- if(index<0)return cdao.findPersistenceObjects(cls);
- if(listChanged[index]) {
- objList[index] = cdao.findPersistenceObjects(cls);
- listChanged[index] = false;
- }
- return objList[index];
- }
-
-
-
-
-
- public void makePersistent(Object obj) {
-
- ps.makePersistent(obj);
- int index = getIndexByClass(obj.getClass());
- if(index<0)return;
- try {
-
- Long id = (Long)obj.getClass().getMethod(getIDMethod[index], new Class[0]).invoke(obj,new Object[] {});
- objMap[index].put(id, obj);
- listChanged[index] = true;
- }catch(Exception e) {
- String msg = "注册类" + objClass[index].getName() + "的方法" + getIDMethod[index] +
- "()调用时产生异常,可能是方法不存在或参数有误。";
- log.error(msg, e);
- throw new RuntimeException(msg);
- }
-
- }
-
-
-
-
-
- public void makeTransient(Class cls) {
- ps.makeTransient(cls);
- int index = getIndexByClass(cls);
- if(index<0)return;
- objMap[index].clear();
- objList[index].clear();
- listChanged[index] = false;
- }
-
-
-
-
-
-
- public void makeTransient(Class cls, Long id) {
- ps.makeTransient(cls,id);
- int index = getIndexByClass(cls);
- if(index<0)return;
- objMap[index].remove(id);
- listChanged[index] = true;
- }
-
-
-
-
-
-
- public void makeTransient(Class cls, Long[] ids) {
- ps.makeTransient(cls,ids);
- int index = getIndexByClass(cls);
- if(index<0)return;
- for(Long id:ids) {
- objMap[index].remove(id);
- }
- listChanged[index] = true;
- }
-
-
-
-
- public static void monitor() {
- new Thread() {
- long mins = 0;
- public void run() {
- while(true) {
- try{
- Thread.sleep(60000);
- log.info("HibernateBuffer监控线程已运行"+(++mins)+"分钟,当前已产生"+count+"个共享实例");
- }catch(InterruptedException e){
- if(log.isInfoEnabled()) {
- log.info("HibernateBuffer监控线程被中断……继续监控……");
- }
- mins++;
- }
- }
- }
- }.start();
- }
-
-
-
-
-
- public static void main(String[] args) {
- monitor();
- HibernateBuffer hb = HibernateBuffer.getInstance();
-
-
- Department dept = (Department)hb.findPersistenceObjByID(Department.class, 1L);
- System.out.println(dept.getName());
-
-
- dept = new Department();
- dept.setName("金融科");
- dept.setNumber("007");
- hb.makePersistent(dept);
-
-
- List deptList = hb.findPersistenceObjects(Department.class);
- System.out.println(deptList.size());
-
-
- hb.makeTransient(Department.class, dept.getDepartmentID());
-
-
- deptList = hb.findPersistenceObjects(Department.class);
- System.out.println(deptList.size());
- }
- }
分享到:
相关推荐
实现一个默认的构造方法(constructor) 4.1.3. 提供一个标识属性(identifier property)(可选) 4.1.4. 建议使用不是final的类 (可选) 4.2. 实现继承(Inheritance) 4.3. 实现equals()和hashCode...
实现一个默认的构造方法(constructor) 4.1.3. 提供一个标识属性(identifier property)(可选) 4.1.4. 建议使用不是final的类 (可选) 4.2. 实现继承(Inheritance) 4.3. 实现equals()和hashCode...
在入门阶段,通常会涉及到一个简单的示例来展示Hibernate的基本用法。例如创建一个表示用户信息的`User`类,并配置其与数据库表之间的映射关系,通过简单的操作实现用户的增删改查等功能。这样的示例有助于初学者...
简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 凯撒加密解密程序 1个目标文件 1、程序结构化,用函数分别实现 2、对文件的加密,解密输出到文件 利用随机函数抽取幸运数字 ...
- **定义**:动态代理允许在运行时创建实现一个或多个接口的类,通常用于实现AOP(面向切面编程)。 - **应用场景**: - **AOP实现**:例如Spring AOP利用动态代理实现切面编程,增强目标类的功能。 - **性能...
Hibernate是一个全功能的ORM解决方案,它提供了一种机制,可以将Java对象映射到数据库表,并且可以将数据库查询语言转换为SQL。Hibernate架构图通常展示以下关键组件: - **Configuration**: 配置文件,定义了...
8. **Spring框架**:Spring的核心组件如IoC、AOP,以及Spring Boot、Spring Cloud等相关知识,面试中可能会让你解释依赖注入的原理或者实现一个简单的AOP切面。 9. **数据库**:SQL基础,如查询优化、索引、事务...
用于提供一个部分实现的基础,子类可以继承并覆盖方法。 #### IOC的优点是什么 - **Inversion of Control (IoC)**: 是一种设计模式,用于降低组件之间的耦合度。通过将对象的创建和管理权交给第三方容器(如Spring...
以上只是部分Java面试中可能会遇到的知识点,具体到这份PDF文件中,每个问题都会配有详细的解答,帮助面试者更好地理解和掌握Java技术。对于正在寻找Java工作或者希望提升自己技能的开发者来说,这份资源无疑是非常...
一个类可以实现多个接口,但只能继承一个抽象类。接口是一种更松耦合的结构。 15. **Java中IO流的分类**:Java中的IO流分为输入流和输出流,再细分可以分为字节流(InputStream、OutputStream)和字符流(Reader、...
13. 反射:动态获取类信息,创建并调用对象,修改私有成员,实现动态代理。 14. 注解:自定义注解,了解编译时注解和运行时注解,以及元注解的使用。 七、JVM 15. 类加载机制:类加载过程(加载、验证、准备、解析...
1. 常见设计模式:熟悉单例、工厂、抽象工厂、建造者、适配器、装饰器、代理、观察者等设计模式的实现。 八、框架知识 SSH(Spring、Struts、Hibernate)是经典的Java企业级开发框架,面试中可能会涉及Spring的依赖...
- 动态代理:Java动态代理的实现,InvocationHandler接口。 6. **设计模式**: - 常见的23种设计模式:单例、工厂、建造者、观察者、装饰者、适配器、策略等模式的应用场景与实现。 7. **JVM优化**: - 内存...
9.9.1. 对一个特定的 DataSource 使用错误的事务管理器 9.10. 更多的资源 10. DAO支持 10.1. 简介 10.2. 一致的异常层次 10.3. 一致的DAO支持抽象类 11. 使用JDBC进行数据访问 11.1. 简介 11.1.1. Spring ...
Java岗面试题库通常会涵盖Java编程语言的基础、进阶概念、框架应用、并发处理、设计模式、数据库操作以及常见的面试技巧等多个方面。以下是一些可能出现在Java面试中的关键知识点: 1. **Java基础** - 数据类型:...
Java面试题汇总是一个珍贵的学习资源,专为Java开发者和毕业生准备,旨在帮助他们更好地理解和掌握Java编程语言的核心概念,以及在实际面试中可能遇到的问题。这份资料包含了广泛的Java面试问题,覆盖了从基础到高级...
在Java面试和笔试中,考察的知识点非常广泛,涵盖了基础语法、面向对象、集合框架、多线程、异常处理、IO流、网络编程、数据库操作、设计模式、JVM优化等多个方面。以下是一些可能被问到的重要知识点的详细解释: 1...
- NIO(New Input/Output):通道(Channel)、缓冲区(Buffer)和选择器(Selector)的概念。 - 文件操作:File类的常用方法及文件复制。 5. **反射与注解**: - 反射:Class类的使用,动态创建对象,调用方法...
9.9.1. 对一个特定的 DataSource 使用错误的事务管理器 9.10. 更多的资源 10. DAO支持 10.1. 简介 10.2. 一致的异常层次 10.3. 一致的DAO支持抽象类 11. 使用JDBC进行数据访问 11.1. 简介 11.1.1. Spring ...
- **装饰器模式**:动态地给一个对象添加新的职责,无需通过子类实现。 - **观察者模式**:定义对象间的一对多依赖,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 - **策略模式**:定义...