再读 深入浅出Hibernate

又看了下深入浅出Hibernate.
感觉在HIbernate中文书籍中,这是本很不错的书.
虽然里面更多的是讲hibernate2,但也值得再回味下.

Hibernate有两个关注点:
一,解决了"关系-对象的不匹配阻抗"
这个看似很简单,就是把ResultSet中的数据集放到了List中.但其中的细节还有待进一步研究
二,Hibernate的性能.
这个冷不防就被人拿来说事.其实使用Hibernate很简单,但要用好,还是有难度的.
书中提到了几个点:
1.List和Iterate的实现原理,及其性能表现
http://japi.iteye.com/blog/257676这个文章有介绍
关键是两者对缓存的不同使用.
List对缓存只写不读,每次执行都会去生成相应的SQL
Iterate有N+1问题,但发挥了缓存的作用.它首先执行一条Select以获得所有符合查询条件的数据ID,再从缓存中根据ID查找对应的实体.
2.批处理方法实现原理
一般人比较推荐绕过hibernate,直接使用JDBC方式
Hibernate在这方面也做了很多工作.
比如设置hibernate.jdbc.batch_size
为了防止出现OutOfMemoryError.
可以隔一段时间清空Session内部缓存
if(i%20==0){
session.flush();
session.clear();
}

3.制定合理的缓存策略,比如二级缓存.使用流行的Ehcache,OScache
缓存同步策略:
1.read-only 只读.这个只对数据索引进行缓存,没有缓存数据实体.
2.read-write,对实体也进行缓存
4.合理的Session管理机制,使用ThreadLocal.现在大多数使用Spring.
5.尽量使用Lazy机制,有集合延迟还有属性延迟
6.合理的参数,比如(batch_size,还有二级缓存的参数).现在都采用配置文件,使用很简单,但做到性能的完美,不是简单的事.
7.使用UUID作为主键
平时一般都是使用native方式,但这样影响移植,数据库本身的性能也不乐观.
8.乐观锁代替悲观锁.
悲观锁,就是依靠于数据库的锁机制,对整个数据都锁定
乐观锁,基于数据版本记录机制.(提交版本号必须大于当前版本号才能执行)
这个锁,还是有待学习啊...了解的几乎为0
---------------------------------------------------------
hibernate中还有一些细节.
比如get/load的问题.
inverse..cascade的理解应用

inverse的使用:http://www.iteye.com/topic/2633
当inverse="true",child得显示设置parent,否则parent为null,无法关联.
inverse="false",child可不需要设置parent,也会关联,但多执行了update sql语句,降低了性能.
在应用的时候,采用双向关联,并把many方,设为主控方,就是在one方中的set节点中inverse="true".

cascade使用:在一对多关联中,关联集合的collection节点中:
cascade多了一个选值:
all-delete-orphan:当被关联对象失去关联宿主时,将其级联删除.
[list]
[*]当保存或更新父亲对象,级联保存或更新儿子对象,相当于cascade属性为:save-update
[*]当删除父亲对象,级联删除所有关联的儿子对象,相当于cascade属性为:delete
[*]删除不再和父亲对象关联的所有儿子对象
[/list]

--------------------------------------------------------------------

实体粒度的细分:
DDD中有实体与值对象之分.我认为这就是一种实体粒度的细分.
细分主要出于两个目的:
1.面向设计的粒度细分
实现更加清晰的系统逻辑

使用Component,运用这个可以达到DDD中的值对象

2.面向性能的粒度细分
提高性能系统的能耗比.
可以运用了lazy机制了.

实体层次设计
主要是继承问题..
还没有应用过...有待学习..

Blob,Clob的使用.....这个也没有应用过...
了解下它们的区别:
Blob,采用单字节存储,适合保存二进制数据,如图片
Clob,采用多字节存储,适合保存大型文本数据.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值