hibernate的配置文件

来源:互联网 发布:月影传说mac版下载 编辑:程序博客网 时间:2024/04/30 04:53

A:

  SessionFactory.getCurrentSessionopenSession区别
    1. 如果使用的是getCurrentSession来创建session的话,在commit后,session就自动被关闭了,
         也就是不用再session.close()了。但是如果使用的是openSession方法创建的session的话,
         那么必须显示的关闭session,也就是调用session.close()方法。这样commit后,session并没有关闭


   2. getCurrentSession的使用可以参见hibernate/hibernate-3.2/doc/tutorial/src项目


   3. 使用SessionFactory.getCurrentSession()需要在hibernate.cfg.xml中如下配置:
   * 如果采用jdbc独立引用程序配置如下:
    <property name="hibernate.current_session_context_class">thread</property>
   * 如果采用了JTA事务配置如下
    <property name="hibernate.current_session_context_class">jta</property>

 

B:

 <property name="hibernate.hbm2ddl.auto" value="create-drop" />

 其实这个参数的作用主要用于:自动创建|更新|验证数据库表结构。如果不是此方面的需求建议set value="none".

 其它几个参数的意思,我解释一下:

 validate               加载hibernate时,验证创建数据库表结构
 create                  每次加载hibernate,重新创建数据库表结构,这就是导致数据库表数据丢失的原因。
 create-drop        加载hibernate时创建,退出是删除表结构
 update                 加载hibernate自动更新数据库结构

 

C:

 

hibernate.jdbc.fetch_size

hibernate.jdbc.batch_size

 

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

 

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,是一个非常保守的设定,根据我的测试,当FetchSize=50的时候,性能会提升1倍之多,当Fetch Size=100,性能还能继续提升20%,FetchSize继续增大,性能提升的就不显著了。

 

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

 

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

 

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

原创粉丝点击