您的位置:首页 > 其它

hibernate优化

2016-07-31 14:42 183 查看
什么是缓存:
缓存就是数据库在内存中的临时容器

位于数据库与数据库访问层中间

ORM在查询数据时首先会根据自身的缓存管理策略,在缓存中查找相关数据,如发现所需数据,则直接将此数据作为结果加以利用

避免了数据库调用性能的开销

相对内存操作而言,数据库调用时一个代价高昂的过程
缓存分类:
一级缓存:(事务级缓存)即在事务范围内的数据缓存,就hibernate来讲,一级缓存是基于session的生命周期实现的,session一旦关闭一级缓存清除。一级缓存为hibernate自带缓存,是必须的

二级缓存:(应用级缓存)在摸个应用中独立数据库访问子集中的共享缓存,此缓存可由多个事务共享。在hibernate中应用级缓存由sessionFactory实现

分布式缓存:即在多个应用实例,多个JVM间共享的缓存策略

查询缓存:利用率不高。
hibernate的延迟加载
在由关联的持久类对象中,对一个对象进行的查询也会向另一个对象进行查询

所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作

Hibernate3.x的lazy(延迟加载)默认为true,需要注意延迟加载的类型
实体对象的延迟加载(load())

集合的延迟加载(一对多和多对多,关联集合)

属性的延迟加载(clob大数据类型时)

hibernate的事务处理
事务是一组原子操作,所有原子操作要么全部执行成功。要么全部失败
hibernate的悲观锁和乐观锁
多个用户可能同时进行访问和更新的操作,为了保证数据在某个操作过程中不会被外界修改,这样的机制,也就是所谓的锁,即给我们选定的目标上锁,使其无法被其他程序修改

hibernate支持两种锁机制
悲观锁:(Pessimistic Locking):依赖与数据库机制,在整个过程中,将数据锁定,其他任何用户不能对其读取和修改,一般适合于短事务,并发性不好

乐观锁:(Optimistic Locking):依靠数据版本记录机制实现
为数据增加一个版本标识,增加一个version字段

读取数据时,将版本号一同读出

更新时,版本加1

将提交数据的版本与数据库表对应记录的当前版本信息进行对比

如果提交数据版本号大于数据库当前版本号,则允以更新,否则认为是过期数据

 
连接池
建立连接池的原因:
每一次请求都要建立一次数据库连接

每一次数据库连接,使用后都要断开

不能控制被创建的连接对象数

频繁的数据库连接操作势必会占用很多的系统资源,响应速度必定下降。程序出现异常而未关闭,将会导致数据库系统中的内存泄漏,最终将不得不重启数据库。系统资源被毫无顾忌的分配出去,如果连接过多,也可能导致内存泄漏,服务器崩溃
连接池的原理:
在dao与数据库之间建立一个缓存池。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需要从“缓冲池”中选取一个,使用完毕之后在放回去。通过设定连接池最大连接数来防止系统无休止的数据库连接。更为重要的是可以通过连接池的管理机制监视数据库的连接的数量使用情况,为系统开发、测试及性能调整提供依据。
连接池的工作流程:
持久层向连接池申请一个连接。
连接池返回一个空闲连接。

如果没有空闲连接,那么就检查连接池中的连接数量是否已经到达最大连接数,
如果没有到达最大连接数,则建立新的连接对象;

如果到达最大连接数,那么用户必须要等待,这时可以设置最大等待时间来控制用户的等待状态。等待时间内有别的连接对象被释放,就分配给等待用户,反之则返回null

 
hibernate常见的优化策略
用高版本的hibernate

指定合理的缓存策略

采用合理的session管理机制

尽量使用延迟加载

如果可能,采用UUID作为之间生成策略

如果可能,选用乐观锁代替悲观锁

在开发中,显示hibernate执行SQL语句,从而指定更好的实现策略

复杂查询和统计查询可以使用SQL语句完成,甚至可以考虑使用储存过程完成
 
 
 
 
 
 
 
 
 
 
 
 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: