`

hibernate.jdbc.fetch_size 和 hibernate.jdbc.batch_size

阅读更多

hibernate.jdbc.fetch_size 50

hibernate.jdbc.batch_size 25

 

这两个选项非常非常非常重要!!!将严重影响Hibernate的CRUD性能!

 

C = create, R = read, U = update, D = delete

 

Fetch Size 是设定JDBC的Statement读取数据的时候每次从数据库中取出的记录条数。

 

例如一次查询1万条记录,对于Oracle的JDBC驱动来说,是不会1次性把1万条取出来的,而只会取出Fetch Size条数,当纪录集遍历完了这些记录以后,再去数据库取Fetch Size条数据。

 

因此大大节省了无谓的内存消耗。当然Fetch Size设的越大,读数据库的次数越少,速度越快;Fetch Size越小,读数据库的次数越多,速度越慢。

 

这有点像平时我们写程序写硬盘文件一样,设立一个Buffer,每次写入Buffer,等Buffer满了以后,一次写入硬盘,道理相同。

 

Oracle数据库的JDBC驱动默认的Fetch Size=10,是一个非常保守的设定,根据我的测试,当Fetch Size=50的时候,性能会提升1倍之多,当Fetch Size=100,性能还能继续提升20%,Fetch Size继续增大,性能提升的就不显著了。

 

因此我建议使用Oracle的一定要将Fetch Size设到50。

 

不过并不是所有的数据库都支持Fetch Size特性,例如MySQL就不支持。

 

MySQL就像我上面说的那种最坏的情况,他总是一下就把1万条记录完全取出来,内存消耗会非常非常惊人!这个情况就没有什么好办法了 :(

 

Batch Size是设定对数据库进行批量删除,批量更新和批量插入的时候的批次大小,有点相当于设置Buffer缓冲区大小的意思。

 

Batch Size越大,批量操作的向数据库发送sql的次数越少,速度就越快。我做的一个测试结果是当Batch Size=0的时候,使用Hibernate对Oracle数据库删除1万条记录需要25秒,Batch Size = 50的时候,删除仅仅需要5秒!!!

//
我们通常不会直接操作一个对象的标识符(identifier), 因此标识符的setter方法应该被声明为私有的(private)。这样当一个对象被保存的时候,只有Hibernate可以为它分配标识符。 你会发现Hibernate可以直接访问被声明为public,private和protected等不同级别访问控制的方法(accessor method)和字段(field)。 所以选择哪种方式来访问属性是完全取决于你,你可以使你的选择与你的程序设计相吻合。

所有的持久类(persistent classes)都要求有无参的构造器(no-argument constructor); 因为Hibernate必须要使用Java反射机制(Reflection)来实例化对象。构造器(constructor)的访问控制可以是私有的(private), 然而当生成运行时代理(runtime proxy)的时候将要求使用至少是package级别的访问控制,这样在没有字节码编入 (bytecode instrumentation)的情况下,从持久化类里获取数据会更有效率一些。

 

 

 

hibernate.max_fetch_depth 设置外连接抓取树的最大深度

取值. 建议设置为03之间

就是每次你在查询时,会级联查询的深度,譬如你对关联vo设置了eager的话,如果fetch_depth值太小的话,会发多很多条sql

 

 

batch-size可以设定在Hbm的class 和 集合定义中. 开始我一直以为batch-size是获取child的数量, 其实真正获取的是parent的数量.

但是奇怪的是当我测试时  我把batch-size的值从1设置到5, 当设成1和2时其实每次获取的还是一个parent.当到3时就是同时获取3个parent.当多出select出来的parent时,感觉好像就没有规律了.我建议一般都把batch-size设成3

下面的来自hibernate文档.(奇怪的是hibernate中文文档并没有关于 batch fetching 的介绍.)


Hibernate can make efficient use of batch fetching, that is, Hibernate can load several uninitialized proxies if one proxy is accessed. Batch fetching is an optimization for the lazy loading strategy. There are two ways you can tune batch fetching: on the class and the collection level.

Batch fetching for classes/entities is easier to understand. Imagine you have the following situation at runtime: You have 25 Cat instances loaded in a Session, each Cat has a reference to its owner, a Person. The Person class is mapped with a proxy, lazy="true". If you now iterate through all cats and call getOwner() on each, Hibernate will by default execute 25 SELECT statements, to retrieve the proxied owners. You can tune this behavior by specifying a batch-size in the mapping of Person:

<class name="Person" lazy="true" batch-size="10">...</class>Hibernate will now execute only three queries, the pattern is 10, 10, 5. You can see that batch fetching is a blind guess, as far as performance optimization goes, it depends on the number of unitilized proxies in a particular Session.

You may also enable batch fetching of collections. For example, if each Person has a lazy collection of Cats, and 10 persons are currently loaded in the Sesssion, iterating through all persons will generate 10 SELECTs, one for every call to getCats(). If you enable batch fetching for the cats collection in the mapping of Person, Hibernate can pre-fetch collections:

<class name="Person">
    <set name="cats" lazy="true" batch-size="3">
        ...
    </set>
</class>With a batch-size of 3, Hibernate will load 3, 3, 3, 1 collections in 4 SELECTs. Again, the value of the attribute depends on the expected number of uninitialized collections in a particular Session.

分享到:
评论
3 楼 Smile__ 2013-09-11  
不过这个东西以前还真没研究过 。
2 楼 Smile__ 2013-09-11  
想不到你也是北大青鸟的 。哈
1 楼 zl239 2012-07-14  

相关推荐

    优化Hibernate性能的几点建议

    此外,还可以通过分析Hibernate的性能指标来调整诸如`hibernate.jdbc.batch_size`等参数,以达到最佳性能平衡。 总之,通过上述几个方面的优化措施,可以显著提高基于Hibernate构建的应用程序的性能。在实际应用中...

    hibernate.cfg.xml中配置信息详解

    Hibernate.jdbc.batch_size 属性用于控制 Hibernate 的批量更新。如果设置为非零值,Hibernate 将使用 JDBC2 的批量更新。 hibernate.jdbc.batch_versioned_data Hibernate.jdbc.batch_versioned_data 属性用于...

    Hibernate3的配置参数汇总

    - `hibernate.default_batch_fetch_size`:设置默认的批量抓取大小,提高查询性能。 - `hibernate.default_entity_mode`:定义Session的默认实体模式,例如POJO或DTO。 这些配置参数可以帮助开发者根据具体项目...

    hibernate.properties

    #hibernate.default_batch_fetch_size 8 ## rollback generated identifier values of deleted entities to default values #hibernate.use_identifier_rollback true ## enable bytecode reflection...

    让hibernate输出sql语句参数配置.doc

    hibernate.jdbc.fetch_size 参数用于指定 JDBC 抓取数量的大小(调用 Statement.setFetchSize())。其取值为非零值。 15. hibernate.jdbc.batch_size hibernate.jdbc.batch_size 参数用于指定 JDBC 批量抓取数量的...

    Hibernate 参数设置一览表.doc

    1. **hibernate.jdbc.fetch_size**:设置JDBC的抓取大小,以优化结果集的处理。 2. **hibernate.jdbc.batch_size**:用于批量更新操作,提高性能。通常建议值在5到30之间。 3. **hibernate.jdbc.batch_versioned_...

    Hibernate 参数配置详解

    例如,通过设置合适的 `hibernate.max_fetch_depth` 和 `hibernate.default_batch_fetch_size` 可以显著提升应用性能;而启用 `hibernate.generate_statistics` 则有助于我们更好地监控和分析应用性能瓶颈。此外,...

    hibernate配置属性参数[定义].pdf

    2. `hibernate.jdbc.batch_size`:用于批量更新操作,设置后 Hibernate 可以利用 JDBC2 的批量更新功能,推荐值一般在 5 到 30 之间。 3. `hibernate.jdbc.batch_versioned_data`:开启后,Hibernate 为自动版本化...

    hibernate 配置属性参数详情(全)

    1. **hibernate.jdbc.fetch_size**:设置JDBC的抓取大小,提高查询性能。 2. **hibernate.jdbc.batch_size**:用于批量更新,推荐值通常在5到30之间。 3. **hibernate.jdbc.batch_versioned_data**:开启后,...

    hibernate参数配置

    13. **hibernate.jdbc.fetch_size**: 设置JDBC抓取(fetch)大小,非零值,通过`Statement.setFetchSize()`控制。 14. **hibernate.jdbc.batch_size**: 用于启用JDBC2批量更新,建议值在5到30之间。 15. **...

    hibernate配置详解

    13. **hibernate.jdbc.fetch_size** 设置JDBC抓取大小,非零值表示从数据库一次性获取的数据量。 14. **hibernate.jdbc.batch_size** 设置批量更新的大小,推荐的值在5到30之间,有助于提升性能。 15. **...

    hibernate 详细配置

    hibernate.jdbc.fetch_size** 设置非零值以指定JDBC查询的抓取大小,提高数据读取效率。 **14. hibernate.jdbc.batch_size** 启用JDBC2的批量更新功能,推荐的值在5到30之间。 **15. hibernate.jdbc.batch_...

    ewrwerw

    根据提供的部分内容,我们可以提炼出与Hibernate框架相关的两个关键配置参数:`hibernate.jdbc.fetch_size` 和 `hiberate.jdbc.batch_size`。这两个参数对于优化基于Hibernate的数据库操作性能至关重要。 ### 1. ...

    hibernate[1].cfg.xml中配置信息详解

    `hibernate.jdbc.batch_size` **用途**:设置批量更新的大小。此配置项可以用来优化大量数据的更新操作。 **取值**:建议取5到30之间的值。 ##### 3. `hibernate.jdbc.batch_versioned_data` **用途**:启用或...

    Hibernate.cfg.xml配置总结

    3. `jdbc.fetch_size`和`jdbc.batch_size`: 分别设置了每次查询的记录数和批量操作的大小,可以优化数据库交互的性能。 四、实体类映射 在Hibernate.cfg.xml中,`&lt;mapping&gt;`元素用于指定实体类对应的映射文件,...

    hibernate配置参数大全

    8. **`hibernate.default_batch_fetch_size`**:定义默认批量获取的大小。 - 示例: ```properties hibernate.default_batch_fetch_size=16 ``` 9. **`hibernate.default_entity_mode`**:定义默认的实体映射...

    hibernate配置参数详解

    1. **`hibernate.jdbc.fetch_size`**: JDBC的取结果集的大小。 ```properties hibernate.jdbc.fetch_size=100 ``` 这个配置项指定了每次从数据库获取数据时的最大行数,适用于大数据量的场景。 这些配置项的...

    Hibernate 参数设置一览表(强烈推荐)

    12. **hibernate.jdbc.batch_size**:预设的批量插入或更新操作的SQL语句数量。 13. **hibernate.order_updates** 和 **hibernate.order_inserts**:如果设置为`true`,Hibernate将按依赖关系排序更新和插入,避免...

    hibernate.cfg.xml文件详细解释

    &lt;property name="jdbc.batch_size"&gt;23 &lt;property name="jdbc.use_scrollable_resultset"&gt;false ``` **说明**: - `fetch_size`:一次从数据库获取的记录数量,增大该值可以减少网络交互次数,但会增加内存消耗。 - ...

Global site tag (gtag.js) - Google Analytics