读书笔记

 

Spring cache+ redis与redis 的比较 2018-03-15

http://blog.csdn.net/u013065023/article/details/54633390

1. 缓存级别不同

    Spring cache是代码级的缓存,他一般是使用一个ConcurrentMap。也就是说实际上还是是使用JVM的内存来缓存对象的,
    那么肯定会造成大量的内存消耗。但是使用方便。
    Redis 作为一个缓存服务器,是内存级的缓存。它是使用单纯的内存来进行缓存。

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.简化查询字段,没用的字段不要,已经对返回结果的控制,尽量返回少量数据;





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值