Hibernate提供以下检索策略:
==> 立即检索
==> 延迟检索
==> 迫切左外连接检索
总结一下优缺点和优先考虑使用的场合
1、立即检索:
优点:
对应用程序完全透明,不管对象处于持久化状态,还是游离状态,应用程序都可以方便地从一个对象导航到与它关联的对象。
缺点:
[1]select语句数目多
[2]可能会加载应用程序不需要访问的对象,浪费时间和内存空间
优先考虑使用的场合:
[1]类级别
[2]应用程序需要立即访问的对象
[3]使用了二级缓存
2、延迟检索:
优点:
由应用程序决定需要加载哪些对象,可以避免执行多余的select语句,以及避免加载应用程序不需要访问的对象。因此能提高检索性能,并且节省内存空间
缺点:
应用程序如果需要访问游离状态的代理类实例,必须保证它在持久化状态时已经被初始化。
优先考虑使用的场合:
[1]一对多或者多对多关联
[2]应用程序不需要立即访问或者根本不访问的对象
3、迫切左外连接检索:
优点:
[1]对应用程序完全透明,不管对象处于之久化状态还是游离状态,应用程序都可以方便的从一个对象导航到另一个与它关联的对象。
[2]使用了外连接,select语句数目少
缺点:
[1]可能会加载应用程序不需要访问的对象,浪费内存空间
[2]复杂的数据表连接会影响检索性能
优先考虑使用的场合:
[1]多对一或者一对一关联
[2]应用程序需要立即访问的对象
[3]数据库系统具有良好的表连接性能
简单总结一下
对于立即检索和延迟检索策略,在查询每张表时使用单独的select语句,每个select语句都很简单,查询速度快,但是select数目过多,增加了DB访问频率。
对于迫切左外连接检索策略,运用了SQL外连接的查询功能,select语句数量少,可减少DB访问频率,但是每个select语句的复杂度增加了,DB系统建立表之间的连接也是耗时的操作,所以查询效率会有所下降。
对于关联级别的立即检索和延迟检索,可以设置批量检索数量,以减少select语句数量,从而改善性能。<class>和<set>的batch-size属性的合理取值应该在3-10之间。
对于实际应用,为了选择合适的检索策略,需要测试应用程序的各个用例,跟踪使用不同检索策略的Hibernate执行SQL的语句。可以把Hibernate.properties文件中的show_sql属性设为true,使得hibernate在运行时输出执行的SQL语句。根据特定的关系模型,评估各种查询语句的性能,比较到底是使用外连接查询速度快,还是使用分开的select语句查询速度快。
select * from CUSTOMERS left outer join ORDERS on CUSTOMERS.ID=ORDERS.CUSTOMER_ID where CUSTOMERS.ID=1;
select * from CUSTOMERS where ID=1;
select * from ORDERS where CUSTOMER_ID=1;
不断的调节检索策略,以便在减少select语句数量和降低select语句复杂度之间找到一个平衡点,获取最佳的检索性能。
具体MappingXML中的配置
了解了各自的优缺点,该到动手配置的时候了。以下几个属性用来控制检索策略:
lazy:可选值为true和false,在<class>和<set>中有此属性,默认值为false,如果为true表示延迟检索。
outer-join:可选值为auto,true和false,在<many-to-one>,<one-to-one>和<set>中有此属性,其中在<many-to-one>和<one-to-one>中默认值为auto,在<set>中默认值为false。如果为true表示使用迫切左外连接策略。
batch-size:在<class>和<set>中有此属性,默认值为1,设定批量检索的数量。如果设定此项,合理的取值在3~10之间的整数。仅适用于关联级的立即检索和延迟检索。