一.缓存分类:
一级缓存:即当前事务范围内的数据缓存
就Hibernate而言,事务级缓存是基于Session的生命周期实现的,session一旦关闭,一级缓存就清除,一级缓存为Hibernate自带的缓存,是必需的
应用级(二级)缓存:
即在某个应用中或应用中某个独立数据库访问子集中的共享缓存,此缓存可由多个事务共享
在hibernate中,应用级缓存由SessionFactory实现
分布式缓存:
即在多个应用实例,多个JVM间共享的缓存策略
二.延迟加载类型:
实体对象的延迟加载(load())
集合的延迟加载(一对多和多对多时,关联集合)
属性的延迟加载(clob大数据类型时)
三.Hibernate的悲观锁和乐观锁
多个用户可能同时读取或更新一个数据
需要一些机制来保证这些数据在某个操作过程中不会被外界修改,这样的机制,也就是所谓的锁,即给我们选定的目标数据上锁,使其无法被其他程序修改
支持两种锁机制:悲观锁和乐观锁
悲观锁:依赖于数据库机制,在整个过程中,将数据锁定,其他任何用户不能对其读取和修改,一般用于短事务,并发性不好
乐观锁:
为数据增加一个版本标识,更新时,版本号加一,将提交的数据与数据库对应记录的当前版本信息进行对比,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据
四.连接池:
不用连接池时,每一次请求都要建立一次数据库连接,每一次数据库连接,使用完后都要关闭连接,频繁的数据库连接会占用很多系统资源,响应速度下降,同时无法设计最大连接数,可能会因为连接数量过多,而导致服务器内存崩溃。程序异常而未能关闭,将会导致数据库系统中的内存泄漏,最终不得不重启数据库。
系统资源被毫无顾忌的分配出去,如连接过多,也可能导致内存泄漏,服务器崩溃
解决方案是:在持久层和数据库之间建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接对象,当需要建立数据库连接时,只需从“缓冲池”中取出一个空闲连接对象,将空闲连接设置为忙碌,使用完毕,再将忙碌状态设置为空闲状态放回链接池中。
由于建立连接后一直不关闭,所以可以减少建连接和关连接的开销,提高响应速度。通过设定连接池最大连接数量来防止系统无休止的数据库连接。更为重要的是可以通过连接池的管理机制监视数据库的连接数量,使用情况,为系统开发,测试及性能调整提供依据。
工作流程:
如果没有空闲连接,则检查当前连接池是否达到最大连接数量,
如果没有达到,则新建一个连接,
如果已经达到,就等待一段时间,
如果等待时间内有连接被释放就把这个连接分配给等待的用户,
如果等待时间超过预定时间timeout,则返回null