又看了下深入浅出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内部缓存
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,采用多字节存储,适合保存大型文本数据.
感觉在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,采用多字节存储,适合保存大型文本数据.