什么是缓存
- 缓存就是数据库数据在内存中的临时容器
- 位于数据库与数据库访问层中间
- ORM在查询数据时首先会根据自身的缓存管理策略,在缓存中查找相关数据,如发现所需的数据,则直接将此数据作为结果加以利用
- 避免了数据库调用性能的开销
- 相对内存操作而言,数据库调用时一个代价高昂的过程
一级缓存
即在当前事务范围内的数据缓存。就hibernate来讲,(一级缓存)事务级缓存是给予Session的生命周期实现的,session一旦关闭,一级缓存就清除,一级缓存为hibernate自带的缓存,是必需的。
应用级缓存(二级缓存)
即在某个应用中或应用中某个独立数据库访问子集中的共享缓存,此缓存可由多个事务共享。在hibernate中,应用级缓存由SessionFactory实现
分布式缓存
即在多个应用实例,多个JVM间共享的缓存策略
延迟加载类型
- 实体对象的延迟加载(load())
- 集合的延迟加载(一对多和多对多时,关联集合)
- 属性的延迟加载(clob大数据类型时)
属性延迟加载中的数据类型
- clob:存放大文本的类型
- blob:存放二进制数据的类型
锁机制
在多个用户可能同时读取或者更新一个数据时,用来保证这些数据在某个操作过程中不会被外界修改的机制,也就是所谓的“锁”机制,即给我们选定的目标数据上锁,使其无法被其他程序修改。
锁的分类
- 悲观锁:Pessimistic Locking
- 乐观锁:Optimistic Locking
数据库隔离界别
- read uncommited:没有提交,就能读到。比如发出insert,在没有提交时就能更新数据库。但是存在脏读,一个事务读取一行,另一个事务已经将记录更新但没有提交,如果一个事务已经写数据,另一个事务则不允许同时进行写操作
- read commited:提交读。提交之后,才可以更新数据库。不存在脏读。存在不可重复读。存在虚读,用户查询数据时,两次查询的内容不一致未提交的写事务将会禁止其他事物访问该行
- repeatable read可重复读。读取的事务将禁止写事务,写事务则禁止任何其他事务不存在不可重复读,但不能避免虚读。
- serializable可序列化读。事务只能一个接一个执行,不能并发执行。
悲观锁
实现依赖于数据库机制,在整个过程中,将数据锁定,其他任何用户不能对其读取和修改,一般适合于短事务,并发性不好。保证操作独占性,性能开销巨大
乐观锁
乐观锁依靠数据版本记录机制实现
- 为数据增加一个版本标识,增加一个version字段
- 读取数据时,将版本号一同读出
- 更新时,版本号加一
- 将提交数据的版本与数据库表对应记录的当前版本信息进行比对
- 如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据
数据连接池
为了使频繁的数据库连接操作不影响响应速度,避免响应速度下降导致程序出现异常而未能关闭所引起的数据库系统中的内存泄漏,重启数据库,系统资源分配不合理造成浪费,服务器崩溃等情况。
为数据库连接建立一个“缓冲池”,预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。通过设定连接池最大连接数来防止系统无休止的数据库连接。更为重要的是可以通过连接池的管理机制监视数据库的连接的数量,使用情况,为系统开发、测试及性能调整提供依据。
连接池工作流程
持久层向连接池申请一个连接。连接池返回一个空闲连接。如果没有空闲连接,那么就检查连接池中的连接数量是否到达最大连接数。如果没有到达最大连接数,则建立新的连接对象放入连接池中。如果到达最大连接数,那么用户就需要等待。这时可以设置最大等待时间来控制用户的等待状态。等待时间内,有别的连接对象被释放,那么就分配给等待用户。如果超时,那么返回null。
hibernate常见的优化策略
- 用高版本的hibernate
- 指定合理的缓存策略
- 采用合理的session管理机制
- 尽量使用延迟加载
- 如有可能,采用UUID作为主键生成策略
- 如有可能,选用乐观锁代替悲观锁
- 在开发中,显示hibernate执行的SQL语句,从而指定更好的实现策略
- 复杂查询和统计查询可以使用SQL语句完成,甚至可以考虑使用存储过程完成
spring框架
优点:
- spring能消除在许多工程中常见的对Singleton的过多使用。
- spring能消除各种各样自定义格式的属性文件的需要,使配置信息性一元化。
- spring能够帮助我们真正意义上实现针对接口编程。
- 使用spring构建的应用程序易于单元测试。
- spring支持JDBC和O/R Mapping产品(Hibernate) MVC Web框架,提供一种清晰,无侵略性的MVC实现方式。
- spring能使用AOP提供声明性事务管理,可以不直接操作JTA也能够对事务进行管理。
IoC(Inversion of Control 控制反转)
控制反转模式的概念:不创建对象,但是描述创建他们的方式。在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务,容器(在spring框架中是IOC容器)负责将这些联系在一起
IoC组件注入的方式
- 接口注入
- 通过set方法注入(设值注入)
- 通过构造方法注入
bean工厂&applicatioinContext联系
- ApplicationContext扩展Bean工厂接口
- ApplicationContext提供附加功能
- Bean工厂延迟加载所有的Bean,直到getBean被调用
- ApplicationContext则在初始化自身时检验,为立即加载。这样有利于检查所一来属性是否注入;所以通常情况下我们选择使用ApplicationContext
- Spring容器中的Bean缺省状态下是单态模式(单例模式)
应用上下文ApplicationContext
- 与BeanFactory类似,载入Bean定义信息,是BeanFactory的子接口。但更为强大
- 提供更多功能
- 提供文本信息解析,支持I18N
- 提供载入文件资源的通用方法
- 向注册为监听器的Bean发送时间
常用实现
- ClassPathXmlApplicationiContext:spring配置文件必须放在src目录下
- FileSystemXmlApplicationContext:配置文件放在工程下
- XmlWebApplicationContext:根据部署路径寻找,webroot。例如:ApplicationContext context = new ClassPathXmlApplicationContext(“app*.xml”)
Bean中id和name的区别
- id是唯一标识bean,不能用特殊字符:X#@,不能用数字开头。在bean引用的时候只能有id指向你需要的bean
- name可以用特殊字符,并且一个bean可以用多个名称:name=“bean1,bean2,bean3”,用逗号隔开。如果没有id,则name的第一个名称默认是id
2016/7/29 14:53:16
AOP
AOP关键词:
- 切面(Aspect):就是你要实现的交叉的非核心业务功能
- 连接点(Joinpoint):应用程序执行过程或者能够插入切面的地点,可以使方法调用,异常抛出。。
- 通知(Advice):通知切面的实际实现代码
- 切入点(Pointcut):定义通知应用在哪些连接点
- 目标对象(Target):被通知的对象
- 代理(Proxy):将通知应用到目标对象后创建的对象
- 织入(Weaving):将切面应用到目标对象从而创建一个新的代理对象的过程
通知类型:
- Around:环绕通知,目标方法执行前执行后都调用
- Before:前置通知,目标方法调用前被调用
- After:后通知,目标方法调用后调用
- Throws:抛出异常通知,目标方法抛出异常时调用
ProxyFactoryBean
- 产生代理对象
- 属性:target代表目标对象
注解@after与@afterReturning区别
- @after:后通知,表示目标方法执行后,无论是否有异常都会执行
- @afterReturning:返回后通知,表示目标方法正常执行后,会执行该方法。但如果目标方法有异常抛出,则不执行。