博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
说一说hibernate的Get和Load
阅读量:4213 次
发布时间:2019-05-26

本文共 1472 字,大约阅读时间需要 4 分钟。

    N多面试题里,只要涉及hibernate就会这样的问题,说一说hibernate的Get和Load到底哪个效率高?我也曾经被这样面过,也被这样的面试题BS过,当时的答案无非就是从谷歌百度上搜一把记下,比如Get不用使用一级缓存和二级缓存,直接从数据库中load。而load采用proxy,走一级缓存和二级缓存,诸如此类的。但是事实上这样吗?proxy和从缓存中有神马关系啊?使用proxy就能使用二级缓存,而get就必须直接从数据库中load,proxy到底有什么神奇的功效?还是从源码说起吧!

Get和Load都会fire一个loadEvent,只不过事件类型不同:

 

public static final LoadType GET = new LoadType("GET")			.setAllowNulls(true)			.setAllowProxyCreation(false)//Get不允许创建proxy			.setCheckDeleted(true)			.setNakedEntityReturned(false);		public static final LoadType LOAD = new LoadType("LOAD")			.setAllowNulls(false)			.setAllowProxyCreation(true)			.setCheckDeleted(true)			.setNakedEntityReturned(false);

 如果没有在配置注册Load的Listener,系统会采用DefaultLoadEventListener来处理

 

errorIfClosed();		checkTransactionSynchStatus();		LoadEventListener[] loadEventListener = listeners.getLoadEventListeners();		for ( int i = 0; i < loadEventListener.length; i++ ) {			loadEventListener[i].onLoad(event, loadType);		}

 最终会调用DefaultLoadEventListener的onload->proxyOrLoad(),Get和Load都会跳到这放个方法,如果发现是load的话,允许创建proxy,直接从persistenceContext中查找是否存在代理,没有则创建有则直接返回.

    如是get则直接从一级缓存,二级缓存中查找,找不到再从数据库中找返回。

 

 

if ( options.isAllowProxyCreation() ) {					return createProxyIfNecessary( event, persister, keyToLoad, options, persistenceContext );				}				else {					// return a newly loaded object					return load(event, persister, keyToLoad, options);//Get行为				}

 为啥要使用Load?

谁能保证你从数据库中取回得对象就一定被使用了,如果取了没用这不是白白浪费资源吗?如用Load,返回一个proxy等你真正用的话再从一次缓存和数据库中取,代理就好比银行卡,而不是真实的钱,等用的时候在ATM上取就行了

转载地址:http://amdmi.baihongyu.com/

你可能感兴趣的文章
Oracle 11g 新特性 -- ASM 增强 说明
查看>>
Oracle 11g 新特性 -- Database Replay (重演) 说明
查看>>
Oracle 11g 新特性 -- 自动诊断资料档案库(ADR) 说明
查看>>
Oracle 11g 新特性 -- RMAN Data Recovery Advisor(DRA) 说明
查看>>
CSDN博客之星 投票说明
查看>>
Oracle wallet 配置 说明
查看>>
Oracle smon_scn_time 表 说明
查看>>
VBox fdisk 不显示 添加的硬盘 解决方法
查看>>
Secure CRT 自动记录日志 配置 小记
查看>>
RMAN RAC 到 单实例 duplicate 自动分配通道 触发 ORA-19505 错误
查看>>
mysql 随机分页的优化
查看>>
DB2快速创建测试库
查看>>
利用db2look查看ddl
查看>>
java中的mmap实现
查看>>
Redis的Aof被阻塞原因调查
查看>>
Redis Cluster的FailOver失败案例分析
查看>>
Android Alarm驱动源代码分析(Alarm.c)
查看>>
S3C2440上LCD驱动 (FrameBuffer)实例开发讲解
查看>>
Linux音频编程指南
查看>>
usb-otg-调试心得
查看>>