当前位置: 首页 > news >正文

大型门户网站建设美丽/百度网站优化培训

大型门户网站建设美丽,百度网站优化培训,做网站大连,政府网站建设问题n 1问题 query.iterate()方式返回迭代查询会开始发出一条语句:查询所有记录ID语句 Hibernate: select student0_.id ascol_0_0_from t_student student0_ 然后有多少条记录,会发出多少条查询语句。 n 1问题:n:有n条记录,发出n条…

n + 1问题

query.iterate()方式返回迭代查询会开始发出一条语句:查询所有记录ID语句

     Hibernate: select student0_.id ascol_0_0_from t_student student0_

然后有多少条记录,会发出多少条查询语句。

n + 1问题:n:有n条记录,发出n条查询语句;1 :发出一条查询所有记录ID语句。

出现n+1的原因:因为iterate(迭代查询)是使用缓存的,第一次查询数据时发出查询语句加载数据并加入到缓存,以后再查询时hibernate会先到ession缓存(一级缓存)中查看数据是否存在,如果存在则直接取出使用,否则发出查询语句进行查询。

            session=HibernateUtils.getSession();tx = session.beginTransaction();/*** 出现N+1问题* 发出查询id列表的sql语句* Hibernate: select student0_.idas col_0_0_ from t_student student0_** 再依次发出根据id查询Student对象的sql语句* Hibernate: select student0_.idas id1_0_, student0_.name as name1_0_,* student0_.createTime ascreateTime1_0_, student0_.classesid as classesid1_0_* from t_student student0_ wherestudent0_.id=?*/Iterator students =session.createQuery("fromStudent").iterate();while (students.hasNext()){Student student=(Student)students.next();System.out.println(student.getName());}tx.commit();


先执行query.list(),再执行query.iterate,这样不会出现N+1问题

因为list操作已经将Student对象放到了一级缓存中,所以再次使用iterate操作的时候

它首先发出一条查询id列表的sql,再根据id到缓存中取数据,只有在缓存中找不到相应的

数据时,才会发出sql到数据库中查询

            List students =session.createQuery("from Student").list();for (Iterator iter =students.iterator();iter.hasNext();){Student student=(Student)iter.next();System.out.println(student.getName());}                      System.out.println("---------------------------------------------------------");// 不会出现N+1问题,因为list操作已经将数据加入到一级缓存。Iterator iters=session.createQuery("from Student").iterate();while (iters.hasNext()){Student student=(Student)iters.next();System.out.println(student.getName());}


list 和 iterate不同之处

a) list取所有

b) Iterate先取ID,等用到的时候再根据ID来取对象

c) session中list第二次发出,仍会到数据库查询

d) iterate第二次,首先找session级缓存

 

Session级缓存(一级缓存)

一级缓存很短和session的生命周期一致,因此也叫session级缓存或事务级缓存

       

哪些方法支持一级缓存:

         get()

         load()

         iterate(查询实体对象)

如何管理一级缓存:

         session.clear(),session.evict()

如何避免一次性大量的实体数据入库导致内存溢出

         先flush,再clear

       

如果数据量特别大,考虑采用jdbc实现,如果jdbc也不能满足要求可以考虑采用数据本身的特定导入工具

转载于:https://www.cnblogs.com/duadu/p/6335824.html

http://www.jmfq.cn/news/4873861.html

相关文章:

  • 推荐几个没封的网站/优化近义词
  • wordpress 首页 函数/站群seo
  • 做任务赚钱网站官网/seo最新教程
  • 如何做繁体字网站/网络营销的基本职能
  • 重庆巴南网站建设/营销推广计划
  • wordpress 管理登录/seo百度排名优化
  • 福州企业高端网站建设制作哪家好/小学生摘抄新闻
  • 西宁手机网站建设/seo服务外包费用
  • 推荐商城网站建设/网站统计工具有哪些
  • 怎么收录网站/网站页面优化方案
  • 泰安做网站公司/免费二级域名分发网站源码
  • zblog 网站源码/杭州专业seo服务公司
  • c 网站开发案例详解百度云/爱链工具
  • 手机网站 php/阿里云云服务平台
  • 勒索做钓鱼网站的人/百度软文推广怎么做
  • 做视频网站需要哪些证/百度知道官网入口
  • 兰州学校网站建设/百度seo技术
  • 做网站宝鸡/最新新闻国内大事件
  • 做变态手术视频网站/聊城seo优化
  • 成都网站建设sntuu/搜索引擎技术基础
  • 女装网站建设规划书怎么写/长沙网站推广有哪些啊
  • 网站建设选择什么系统好/湖南好搜公司seo
  • 台州建设局网站信息价/亚马逊跨境电商开店流程及费用
  • 在建工程/广州seo优化排名推广
  • 那个网站教宝妈做辅食/seo外包 杭州
  • 品牌推广网站怎么做/网站空间租用
  • 深圳网站建设antnw/seo网站系统
  • 生物医药基地网站建设/品牌推广软文
  • 华为免费企业网站建设/买卖交易网
  • 基于搜索引擎的网站推广方式/我要下载百度