Spring cache+ redis与redis 的比较 2018-03-15
1. 缓存级别不同
4. spring cache基本原理
和 spring 的事务管理类似,spring cache 的关键原理就是 spring AOP,通过 spring AOP,其实现了在方法调用前、调用后获取方法的入参和返回值,进而实现了缓存的逻辑。我们来看一下下面这个图:
Spring工作原理
Spring 已经用过一段时间了,感觉Spring是个很不错的框架。
内部最核心的就是IOC了,动态注入,让一个对象的创建不用new了,可以自动的生产,这其实就是利用java里的反射,反射其实就是在运行时动态的去创建、调用对象,Spring就是在运行时,跟xml Spring的配置文件来动态的创建对象,和调用对象里的方法的 。
Spring还有一个核心就是AOP这个就是面向切面编程,可以为某一类对象 进行监督和控制(也就是在调用这类对象的具体方法的前后去调用你指定的 模块)从而达到对一个模块扩充的功能。这些都是通过配置类达到的。
Spring目的:就是让对象与对象(模块与模块)之间的关系没有通过代码来关联,都是通过配置类说明管理的(Spring根据这些配置 内部通过反射去动态的组装对象)
Spring 面试题
1. Spring框架有哪些模块?
Spring框架由七个模块组成组成,这7个模块(或组件)均可以单独存在,也可以与其它一个或多个模块联合使用,如下所示:
(1)Spring 核心容器——IoC容器
(2)Spring AOP
(3)Spring ORM
(4)Spring DAO
(5)Spring WEB
(6)Spring上下文(Context)
(7)Spring MVC
2. 为什么要使用Spring框架,它有什么优点?
(1)轻量级的框架
(2)非侵入性的
(3)可以整合其它的框架,比如Struts,Hibernate等
(4)可以提供事务管理
4.怎么使用Spring配置事务?
Spring同时支持编程式事务策略和声明式事务策略,大部分时候都采用声明式事务策略。
声明式事务管理的配置方式,通常有以下4种:
(1)使用TransactionProxyFactoryBean为目标Bean生成事务代理的配置。此方式是最传统、配置文件最臃肿、最难以阅读的方式。
(2)采用Bean继承的事务代理配置方式,比较简洁,但依然是增量式配置。
(3)采用BeanNameAutoProxyCreator,根据Bean Name自动生成事务代理的方式。这是直接利用Spring的AOP框架配置事务代理的方式,需要对Spring的AOP框架有所理解。但这种方式避免了增量式配置,效果非常不错。
(4)采用DefaultAdvisorAutoProxyCreator,直接利用Spring的AOP框架配置事务代理的方式,效果非常不错,只是这种配置方式的可读性不如第3种方式。
4.说下Hibernate的缓存机制
1.内部缓存存在Hibernate中又叫一级缓存,属于应用事物级缓存;
2.二级缓存:
a)应用级缓存;
b)分布式缓存;
条件:数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据被系统频繁使用、非关键数据;
c)第三方缓存的实现;
6.如何优化Hibernate?
1.使用双向一对多关联,不使用单向一对多;
2.灵活使用单向一对多关联;
3.不用一对一,用多对一取代;
4.配置对象缓存,不使用集合缓存;
5.一对多集合使用Bag,多对多集合使用Set;
6.继承类使用显式多态;
7.表字段要少,表关联不要怕多,有二级缓存撑腰 ;
hibernate 面试题小集
3.说说Hibernate中的update()和saveOrUpdate()的区别,session的load()和get()的区别。
saveOrUpdate()方法可以实现update()的功能,但会多些步骤,具体如下:
1. 如果对象在该session中已经被持久化,不进行操作;
2. 对象的标识符属性(identifier property)在数据库中不存在或者是个暂时的值,调用save()方法保存它;
3. 如果session中的另一个对象有相同的标识符抛出一个异常;以上皆不符合则调用update()更新之。
Session.load/get方法均可以根据指定的实体类和id从数据库读取记录,并返回与之对应的实体对象。
session的get()和load()其区别在于:
1. 如果未能发现符合条件的记录,get方法返回null,而load方法会抛出一个ObjectNotFoundException;
2. load方法可返回实体的代理类实例,而get方法永远直接返回实体类;
3. load方法可以充分利用内部缓存和二级缓存中的现有数据,而get方法则仅仅在内部缓存中进行数据查找,如没有发现对应数据,将越过二级缓存,直接调用SQL完成数据读取。
hibernate中对象的三种状态?
瞬时态(Transient)、持久态(Persistent)、脱管态(Detached)。
处于持久态的对象也称为PO(Persistence Object),瞬时对象和脱管对象也称为VO(Value Object)。
瞬时态:
由new命令开辟内存空间的java对象, eg. Person person =new Person(”amigo”, “女”);
如果没有变量对该对象进行引用,它将被java虚拟机回收。
瞬时对象在内存孤立存在,它是携带信息的载体,不和数据库的数据有任何关联关系,在Hibernate中,可通过session的save()或 saveOrUpdate()方法将瞬时对象与数据库相关联,并将数据对应的插入数据库中,
此时该瞬时对象转变成持久化对象。
持久态:
处于该状态的对象在数据库中具有对应的记录,并拥有一个持久化标识。如果是用hibernate的delete()方法,对应的持久对象就变成瞬时对象,因数据库中的对应数据已被删除,该对象不再与数据库的记录关联。
当一个session执行close()或clear()、evict()之后,持久对象变成脱管对象,此时持久对象会变成脱管对象,此时该对象虽然具有数据库识别值,但它已不在HIbernate持久层的管理之下。
持久对象具有如下特点:
1.和session实例关联;
2.在数据库中有与之关联的记录。
脱管态:
当与某持久对象关联的session被关闭后,该持久对象转变为脱管对象。当脱管对象被重新关联到session上时,并再次转变成持久对象。
脱管对象拥有数据库的识别值,可通过update()、saveOrUpdate()等方法,转变成持久对象。
脱管对象具有如下特点:
1.本质上与瞬时对象相同,在没有任何变量引用它时,JVM会在适当的时候将它回收;
2.比瞬时对象多了一个数据库记录标识值。
1.在数据库中条件查询速度很慢的时候,如何优化?
1.建索引;
2.减少表之间的关联;
3.优化sql,尽量让sql很快定位数据,不要让sql做全表查询,应该走索引,把数据量大的表排在前面;
4.简化查询字段,没用的字段不要,已经对返回结果的控制,尽量返回少量数据;