观点:对于n+1问题的理解。

  一般而言说n+1意思是,无论在一对多还是多对一当查询出n条数据之后,每条数据会关联的查询1次他的关联对象,这就叫做n+1。

  但是我的理解是,本来所有信息可以一次性查询出来,也就是简单的连表查询,但是Hibernate会首先查询1次得到当前对象,然后当前对象里面的n个关联对象会再次访问数据库n次,这就是1+n问题。

  他们二者之间表达的意思其实是一样的,只是描述这个问题的角度不同。不过我认为1+n更准确,因为以前我第一次看到n+1问题的时候就总是在想是不是查n然后多出一次,那其实是没什么影响的,后来才明白。

  既然出现这个问题,肯定是要避免的,尤其是对于高并发的互联网应用,这种现象是绝对不允许出现的。

  Hibernate给出了3中解决方案,不过我个人比较偏向于手动写sql,也就是JDBC或者iBatis那种风格。因为这样的sql是绝对可控的,只是在移植性方面不如Hibernate。各有所长各有所短吧。

  下面是3中解决方案:

  1.延迟加载,当需要的时候才查询,不需要就不查询,但是感觉这种方式治标不治本,尤其是在那种报表统计查询的时候更为明显。

  2.fetch="join",默认是fetch="select",这个其实说白了就是一个做外连接,允许外键为空的情况之下。

  3.二级缓存,第一次查询之后存在内存中,后面的相同查询就快了。但是有2个缺点:a.二级缓存首先是有点浪费内存空间,如果多了的话浪费还比较严重,这是一个不好的方面,当然这不是主要的,主要的问题在于,二级缓存的特性决定的,那就是很少的增删改才做二级缓存,而对于普通的CRUD系统,其实不太适合。所以感觉也不是首选。

  综合来看,用外联结的方式比较好,Hibernate里面貌似叫什么迫切外联结,不知道他究竟有多迫切,非得取个这样的名字,不就是个关联查询嘛。

  参考:http://blog.163.com/weizonghua_2006/blog/static/13106065620124249412653/

最新文章

  1. 通过Dockerfile建立.NET Core mvc Image
  2. Java基础学习 -- Java(OOP)程序的设计原则
  3. mysql 表字段不能使用type???
  4. [开源]基于STM32的录音播放装置
  5. PHP控制前台弹出对话框
  6. C# 获取某月的第一天和最后一天
  7. 一种基于PTP 协议的局域网高精度时钟同步方法(转)
  8. IOS 点击按钮 光环 冲击波效果
  9. MongoVUE 如何导出数据
  10. Linux---文件类型及权限操作
  11. USACO5.4-TeleCowmunication
  12. jQuery学习-事件之绑定事件(七)
  13. linux_安装 redis
  14. uboot中 make xxx_config 的作用(以make smdk2410_config为例)
  15. 2018-2019-2 网络对抗技术 20162329 Exp5 MSF基础应用
  16. CSS3 box-sizing的作用
  17. C#正则表达式。
  18. nginx学习笔记(一)
  19. H5 audio标签
  20. Upload Files In ASP.NET Core 1.0 (Form POST And JQuery Ajax)

热门文章

  1. ApacheBench(ab)使用详解
  2. Sublime插件库新成员基于APICloud快速开发跨平台App
  3. 使用pycharm远程调试python代码
  4. RabbitMQ学习总结 第六篇:Topic类型的exchange
  5. 号外号外:9月21号关于Speed-BI 《全国人口统计数据分析》开讲了
  6. C# 键盘钩子类
  7. Windows平台注册mysql服务
  8. ImportError: No module named setuptools
  9. JS练习 改变文本框状态
  10. 使用opencv显示视频的方法