WEB开发网
开发学院软件开发Java Hibernate高级应用:性能优化策略 阅读

Hibernate高级应用:性能优化策略

 2012-09-17 20:42:48 来源:WEB开发网   
核心提示:· 如在set标签上设置fetch=”select”,下面的查询:List list = session.createQuery("from Classes cls where id in (1,22)").list();将产生如下结果:Hibe
· 如在set标签上设置fetch=”select”,下面的查询:List list = session.createQuery("from Classes cls where id in (1,22)").list();将产生如下结果:
Hibernate: select classes0_.id as id7_, classes0_.name as name7_ from T_Classes classes0_ where classes0_.id in (1 , 22)<o:p></o:p>
<o:p> </o:p>
Hibernate: select students0_.classesid as classesid1_, students0_.id as id1_, students0_.id as id8_0_, students0_.name as name8_0_, students0_.sex as sex8_0_, students0_.classesid as classesid8_0_ from T_Student students0_ where students0_.classesid=?<o:p></o:p>
<o:p> </o:p>
Hibernate: select students0_.classesid as classesid1_, students0_.id as id1_, students0_.id as id8_0_, students0_.name as name8_0_, students0_.sex as sex8_0_, students0_.classesid as classesid8_0_ from T_Student students0_ where students0_.classesid=?<o:p></o:p>
可见,总共发出:第一,查询Classes的数据;第二,因为查询结果集中有两个Classes对象,所以针对每个对象,都发出了一个查询语句以便查询其students集合的数据。<o:p></o:p>
· <o:p> </o:p>
· 子查询抓取(Subselect fetching) - 另外发送一条SELECT 语句抓取在前面查询到(或者抓取到)的所有实体对象的关联集合。除非你显式的指定lazy="false" 禁止延迟抓取(lazy fetching),否则只有当你真正访问关联关系的时候,才会执行第二条select语句。 设置方法是:fetch=”subselect”,它只能被设置在集合映射的属性上。
· 如在set标签上设置fetch=”sebselect”,下面的查询:List list = session.createQuery("from Classes cls where id in (1,22)").list();在list对象中,将包含两个Classes对象的实例,假设其集合上配置lazy=”false”,我们立刻就能看到hibernate的subselect抓取策略是:
以下是hibernate生成的SQL语句:<o:p></o:p>
Hibernate: select classes0_.id as id7_, classes0_.name as name7_ from T_Classes classes0_ where classes0_.id in (1 , 22)<o:p></o:p>
<o:p> </o:p>
☞悲观锁和乐观锁
两个人同时修改用一条数据时,就会才产生数据不一致
这是我们需要用乐观锁来解决这个问题!
悲观锁:锁定一条记录,当修改成功后,对方才能修改(一直等待)
在实体bean中设置
Person p=(Person)session.get(Person.class, 1,LockOptions.UPGRADE);
缺点:当遇到多个线程的时候,会发送死锁,效率也不高(不建议使用)
乐观锁(建议使用):通过版本号约束hibernate是否更新,避免了数据更新的丢失,在实体类中加属性版本号:int versionNumber ,在对应的映射文件中添加<version name="versionNumber"></version>
5.批量更新/保存
向数据库中插入1万条数据,如何提高效率?
对于在Mysql数据库中加入<property name="hibernate.connection.url">(oracle数据库中则不需要加入)
jdbc:mysql://localhost/hibernate?rewriteBatchedStatements=true</property>
//<property name="hibernate.jdbc.batch_size">25</property>

上一页  1 2 

Tags:Hibernate 高级 应用

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接