zoukankan      html  css  js  c++  java
  • 关于Hibernate性能优化之 FetchType=Lazy时查询数据

    当表A和表B一对多的关系
    
    对于A和B的实体类,设置FetchType=EAGER时,取A表数据,对应B表的数据都会跟着一起加载,优点不用进行二次查询。缺点是严重影响数据查询的访问时间。
    
    解决办法FetchType=LAZY,此时查询的访问时间大大缩短,缺点是查询表A 的数据时,访问不到表B的数据。
    
    解决办法尝试一,在web.xml中加入下面配置,表示在页面中关闭session
    
    <!-- 把session的关闭延迟到jsp页面显示之后,在配在struts2上面。-->
        <filter>
            <filter-name>OpenSessionInView</filter-name>
            <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>OpenSessionInView</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    出现的问题是:新增加一条记录回到列表页面,对应的B表数据还是没有。
    解决办法尝试二:
    在session未关闭前循环List,显示调用,举例如下
    for(B b:bList){
        b.getA();
    }
    出现问题:如果debug模式,可以获得A信息,如果tomcat正常运行模式,还是取不到A。没有具体研究是不是因为我们实在ManyToOne多的端取一端。
    解决办法三:此办法可以应用
    for(B b:bList){
       Hibernate.initialize( b.getA());
    }
    解决办法四:此办法也可以应用
    在session关闭后,我可以循环
    for(B b:bList){
       int aId = b.getA().getId();
      A a =  findAById(aId);
      b.setA(a);
    }

    来源:https://blog.csdn.net/janefir/article/details/19555803

  • 相关阅读:
    MySQL CREATE EVENT创建任务计划 定时执行任务
    MYSQL 的一些基本操作
    PHP mktime() 函数
    php格式化数字:位数不足前面加0补足
    浅析大数据量高并发的数据库优化
    使用SquirrelMQ打造一个千万级数据更新量的应用
    MySQL行锁深入研究
    MySQL 学习笔记 一
    利用C#操作配置文件(转)
    每个分类取最新的几条的SQL实现(转载记录)
  • 原文地址:https://www.cnblogs.com/hahajava/p/9073344.html
Copyright © 2011-2022 走看看