- 浏览: 229898 次
- 性别:
- 来自: 武汉
最新评论
-
spp_1987:
org.springframework.beans.facto ...
Hibernate4之多对多双向关联 -
spp_1987:
后台保存订单下面 有很多订单 调了 对应什么方法 实现的?
Hibernate4之多对多双向关联 -
spp_1987:
订单 和 商品之间 有中间表存在吗???
Hibernate4之多对多双向关联 -
spp_1987:
跟 官方 hibernate4.2.5提供 的 manytom ...
Hibernate4之JPA规范配置详解 -
zhuguopei_java:
谢谢。楼主你这是解释源码吗
Struts2中action接收参数的三种方法及ModelDriven和Preparable接口结合JAVA反射机制的灵活用法
Hibernate有一些fetching策略,来优化Hibernate所生成的select语句,以尽可能地提高效率。在映射关系中声明fetching策略,定义Hibernate怎样获取其相关的集合和实体。
影响关系映射抓取的cfg配置:
hibernate.max_fetch_depth
为单向关联(一对一, 多对一)的外连接抓取(outer join fetch)树设置最大深度. 值为0意味着将关闭默认的外连接抓取.
取值 建议在0到3之间取值
hibernate.default_batch_fetch_size
为Hibernate关联的批量抓取设置默认数量.
取值 建议的取值为4, 8, 和16
如果你的数据库支持ANSI, Oracle或Sybase风格的外连接, 外连接抓取通常能通过限制往返数据库次数 (更多的工作交由数据库自己来完成)来提高效率. 外连接抓取允许在单个SELECTSQL语句中, 通过many-to-one, one-to-many, many-to-many和one-to-one关联获取连接对象的整个对象图.
将hibernate.max_fetch_depth设为0能在全局 范围内禁止外连接抓取. 设为1或更高值能启用one-to-one和many-to-one外连接关联的外连接抓取, 它们通过 fetch="join"来映射.
Hibernate有四种fetching策略,当同时配置了JPA的fetch时,会优先使用Hibernate的注解:
- fetch-“join”:禁用延迟加载,总是立即加载所有的集合和实体。
- fetch-“select”(默认):延迟加载所有的集合和实体。
- fetch-“subselect”:将其集合组织到一个子查询语句中。
- batch-size=”N”:获取上限为“N”个的集合或实体,没有记录。
在XML映射文件中声明fetch策略:
... <hibernate-mapping> <class name="com.java.demo.Stock" table="stock"> <set name="stockDailyRecords" cascade="all" inverse="true" table="stock_daily_record" batch-size="10" fetch="select"> <key> <column name="STOCK_ID" not-null="true" /> </key> <one-to-many class="com.java.demo.StockDailyRecord" /> </set> </class> </hibernate-mapping>
以标注的形式声明fetch策略:
... @Entity @Table(name = "stock") public class Stock implements Serializable{ ... @OneToMany(fetch = FetchType.LAZY, mappedBy = "stock") @Cascade(CascadeType.ALL) @Fetch(FetchMode.SELECT) @BatchSize(size = 10) public Set<StockDailyRecord> getStockDailyRecords() { return this.stockDailyRecords; } ... }
下面探讨fetch策略如何影响到Hibernate生成的SQL语句
1、@Fetch(FetchMode.SELECT)
另外发送一条SELECT语句抓取当前对象的关联实体或集合。除非你显式的指定lazy="false"禁止延迟抓取(lazy fetching),否则只有当你真正访问关联关系的时候,才会执行第二条select语句。
这是默认的fetch策略。请看示例代码:
//call select from stock Stock stock = (Stock)session.get(Stock.class, 114); Set sets = stock.getStockDailyRecords(); //call select from stock_daily_record for ( Iterator iter = sets.iterator();iter.hasNext(); ) { StockDailyRecord sdr = (StockDailyRecord) iter.next(); System.out.println(sdr.getDailyRecordId()); System.out.println(sdr.getDate()); }
输出如下:
Hibernate: select ...from demo.stock where stock0_.STOCK_ID=? Hibernate: select ...from demo.stock_daily_record where stockdaily0_.STOCK_ID=?
2、@Fetch(FetchMode.JOIN)
“join”类型fetch策略将禁用延迟加载所有相关的集合。Hibernate通过在SELECT语句使用OUTER JOIN(外连接)来获得对象的关联实例或者关联集合。
执行上面的代码输出如下:
Hibernate: select ... from demo.stock stock0_ left outer join demo.stock_daily_record stockdaily1_ on stock0_.STOCK_ID=stockdaily1_.STOCK_ID where stock0_.STOCK_ID=?
Hibernate只生成一个select语句,当Stock被初始化时,它获取所有其相关的集合。
3、@Fetch(FetchMode.SUBSELECT)
Fetching策略能够将其所有相关集合放在一个子select语句中。
另外发送一条SELECT 语句抓取在前面查询到(或者抓取到)的所有实体对象的关联集合。除非你显式的指定lazy="false" 禁止延迟抓取(lazy fetching),否则只有当你真正访问关联关系的时候,才会执行第二条select语句。
当通过Query等接口查询多个实体时,如果指定fetch="subselect"则将通过子查询获取集合
还是运行上面代码输出:
Hibernate: select ... from demo.stock stock0_ Hibernate: select ... from demo.stock_daily_record stockdaily0_ where stockdaily0_.STOCK_ID in ( select stock0_.STOCK_ID from demo.stock stock0_ )
4、@BatchSize(size=10)
对查询抓取的优化方案,通过指定一个主键或外键列表,Hibernate使用单条SELECT语句获取一批对象实例或集合。
当通过Query等接口查询多个实体时,如果指定farm的batch-size="……"则将通过使用单条SELECT语句获取一批对象实例或集合。
可指定全局批量抓取策略: hibernate.default_batch_fetch_size,取值:建议的取值为4, 8, 和16。
执行上面代码输出如下:
Hibernate: select ...from demo.stock where stock0_.STOCK_ID=? Hibernate: select ...from demo.stock_daily_record where stockdaily0_.STOCK_ID=?
batch-size什么也没做。请看下面的解释:
batch-size fetching策略并不是定义集合中有多少记录被预加载。相反,它其实是定义有多少集合应该被加载。
List<Stock> list = session.createQuery("from Stock").list(); for(Stock stock : list){ Set sets = stock.getStockDailyRecords(); for ( Iterator iter = sets.iterator();iter.hasNext(); ) { StockDailyRecord sdr = (StockDailyRecord) iter.next(); System.out.println(sdr.getDailyRecordId()); System.out.println(sdr.getDate()); } }
没有batch-size fetching策略时,输出:
Hibernate: select ... from demo.stock stock0_ Hibernate: select ... from demo.stock_daily_record stockdaily0_ where stockdaily0_.STOCK_ID=? Hibernate: select ... from demo.stock_daily_record stockdaily0_ where stockdaily0_.STOCK_ID=? 继续重复select语句....这取决于数据表中有多少条stock记录。
如果在数据库中有20条股票记录,Hibernate默认的fetching策略将生成20+1个select语句,这将对数据库造成一定的冲击。
启用batch-size=”10” fetching策略时,输出:
Hibernate: select ... from demo.stock stock0_ Hibernate: select ... from demo.stock_daily_record stockdaily0_ where stockdaily0_.STOCK_ID in ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
现在,Hibernate将预提取集合,使用select in语句。如果在数据库中有20条股票记录,Hibernate将生成3个select语句
抓取优化
集合N+1:
可以使用batch-size来减少获取次数,即如batch-size=”10”,则是N/10+1。
开启二级缓存。
对于集合比较小且一定会用到的可采用fetch=”join”,这样只需一条语句。
结论
Fetching策略非常具有弹性,是一个优化Hibernate查询的非常重要的技巧。不过如果用在错误的地方,那将会是一个灾难。
发表评论
-
Hibernate4之OpenSessionInView
2012-08-26 23:00 8OpenSessionInView这个Filter在SSH整合 ... -
Hibernate4性能之并发和锁机制
2012-08-20 16:19 3136数据库事务的定义 数据 ... -
Hibernate4之cascade与inverse
2012-08-16 17:35 2838简单地说,“inverse”决定哪一边来更新外键,而“cas ... -
Hibernate4之getCurrentSession和openSession
2012-08-13 16:39 10669在一个应用程序中,如果DAO层使用Spring的hiber ... -
Hibernate4之JPA规范配置详解
2012-08-12 15:18 11082@Table Table用来定义entity主表的name, ... -
Hibernate4之二级缓存
2012-08-19 21:38 4996缓存:缓存是什么,解 ... -
Hibernate4之事务机制
2012-08-20 15:00 3416首先来认识以下J2EE常见 ... -
Hibernate4性能之批量处理的三种方式
2012-08-15 17:36 8632假如有如下程序,需要向数据库里面加如100000条数据 S ... -
Hibernate4之SQLQuery接口SQL方式查询
2012-08-15 16:58 4562对原生SQL查询执行的控制是通过SQLQuery接口进行的, ... -
Hibernate4之Criteria接口QBC方式查询
2012-08-15 17:15 3673分页查询 Criteria crit = session. ... -
Hibernate4之Query接口HQL方式查询
2012-08-14 17:52 7159Hibernate实现按条件查询 ... -
Hibernate4之Session一级缓存
2012-08-14 16:06 2332Session缓存的作用: 1.减少访问数据库的频率,应用程 ... -
Hibernate4之多对多双向关联
2012-08-10 10:26 1993在这里多对多关系@ManyToMany,默认是延迟加载的。 ... -
Hibernate4之多对多单向关联
2012-08-10 10:18 1468多个商品可以在不同的订单中出现,所以商品相对于订单是多对多关系 ... -
Hibernate4之一对多双自身向关联
2012-08-10 10:06 2788商品分类信息可以有很多分类信息,每个分类信息都有下级关系和上级 ... -
Hibernate4之一对多双向关联
2012-08-10 09:59 1794一个用户可以有多个订单,订单相对于用户的关系就是多对一的关系。 ... -
Hibernate4之多对一单向关联
2012-08-09 18:12 1392一个客户可以有多个订单,订单对应一个客户的关系就是多对一。 在 ... -
Hibernate4之一对一关联
2012-08-09 18:05 2198每个用户注册信息就对应一个登录信息,双方是相互依存的,由于主键 ... -
Hibernate4之主键映射机制
2012-07-31 16:08 4025关系型数据库中依靠主键来区分不同的记录,主键又有自然主键和代 ... -
Hibernate4之映射基本数据类型
2012-07-31 10:42 2062Hibernate的基本映射数据类型是Java基本类型与标准 ...
相关推荐
【标题】:优化 Hibernate 性能的关键策略 【描述】:在使用 Hibernate 进行数据库操作时,性能问题时常出现,但通过适当的调整和优化,我们可以显著提高 Hibernate 的执行效率,甚至达到接近或超过直接使用 JDBC ...
因此,平衡延迟加载和立即加载的使用,结合合适的批量抓取策略,是提高Hibernate性能的关键。 总的来说,理解并熟练运用Hibernate的抓取策略,能够帮助开发者创建更高效的数据访问层,降低系统开销,从而提升整体...
《Hibernate性能优化》 ...以上是Hibernate性能优化的一些核心点,实践中还需要结合具体项目进行调整和测试,找到最适合的优化策略。学习和理解这些知识点,有助于开发出更高效、更稳定的Java应用程序。
【提高Hibernate性能】 在开发大型企业级应用时,ORM框架如Hibernate在处理大量数据时可能会出现性能瓶颈。针对这种情况,优化Hibernate的配置和使用策略至关重要。以下是一些提高Hibernate性能的关键点: 1. **...
在Java的持久化框架Hibernate中,数据访问优化...总的来说,选择合适的抓取策略和恰当使用懒加载是优化Hibernate应用性能的重要手段。开发者应根据业务场景灵活运用,平衡内存消耗与数据库交互,以达到最佳的性能表现。
《Hibernate性能优化共9页.pdf》的压缩包文件聚焦于Java开发中的一个重要框架——Hibernate的性能调优。Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作,但同时也可能带来性能问题。以下...
为了解决这个问题,Hibernate提供了多种抓取策略,如Eager Loading(急加载)、Batch Fetching(批量加载)和Subselect Fetching(子查询加载)等。 1. Eager Loading:急加载是一种在加载主对象时同时加载其关联...
在Hibernate中,针对关联对象的检索,有三种主要的检索策略:立即检索(Eager Fetching)、延迟检索(Lazy Fetching)和迫切左外连接检索(Anxious Left Join Fetching)。下面将详细探讨这三种策略的特点。 #### 1. 立即...
- Hibernate通过延迟加载策略,只在实际访问数据时才加载,节省内存,提高性能。 7. **类之间的关系映射**: - 通过配置文件如`one-to-many`、`many-to-one`、`many-to-many`等映射关系,实现类与类的关联。 8. ...
Fetching 策略定义了 Hibernate 在执行查询时如何获取关联的数据。主要有以下几种: 1. **Join Fetching**:这是一种将主表与关联表通过 OUTER JOIN 连接起来的方式进行查询。这种方式通常用于查询所有相关联数据时...
5. **性能优化**:讨论如何根据业务需求调整懒加载策略,以平衡性能和内存使用,可能涉及Eager Fetching、Fetch Graphs和JOIN fetch。 6. **Open Session in View(OSIV)模式**:如果文章涉及,可能会介绍这个模式...
在`hibernate_fetch_1`示例中,我们了解到Hibernate的加载策略,包括Eager Fetching(即时加载)和Lazy Fetching(延迟加载)。即时加载会在查询时一起加载关联的对象,而延迟加载则只在真正需要时才执行数据库查询...
总结,Hibernate的批处理是大数据场景下提高性能的关键技术之一,需要根据具体业务需求和系统资源进行细致的配置和优化。了解并掌握这些知识点,能够帮助开发者更高效地利用Hibernate处理大规模数据。
11. ** Cascading 和 Fetching策略**:Cascading允许开发者设置关联对象的保存、更新、删除行为。Fetching策略则控制何时加载关联对象,包括懒加载(Lazy Loading)和急加载(Eager Loading)。 12. **事件和监听器...
Hibernate提供了多种加载策略,包括立即加载(Eager Fetching)和延迟加载(Lazy Loading)。立即加载会一次性获取所有关联数据,而延迟加载则会在需要时才执行数据库查询。查询缓存则能存储已执行过的查询结果,...
4. **Subselect Fetching**:这种策略在加载主实体时,同时执行一个子查询来获取关联对象。这种方式适用于关联数据需要复杂条件过滤的情况。 5. **@EntityGraph**:从Hibernate 4.3开始引入,允许我们定义图形化的...
6. **Cascading和Fetching策略**:解释如何设置对象间的级联操作,以及优化数据加载的懒加载和立即加载策略。 7. **性能优化**:讨论Hibernate的缓存机制,包括第一级缓存和第二级缓存,以及如何通过配置和设计优化...
九、Cascading与Fetching策略 Hibernate的级联操作允许在一个对象的操作中自动处理相关对象,如CascadeType.ALL表示所有操作都会影响关联对象。加载策略包括懒加载(Lazy Loading)和急加载(Eager Loading),用于...
9. **Cascading and Fetching Strategies**:级联操作(Cascading)可以将操作影响范围扩展到关联的对象,而加载策略(Fetching Strategies)则决定了何时以及如何加载关联的数据。 10. **Custom Types**:...