Linux安全网 - Linux操作系统_Linux 命令_Linux教程_Linux黑客

会员投稿 投稿指南 本期推荐:
搜索:
您的位置: Linux安全网 > Linux集群 > Architecture > » 正文

说一说hibernate的Get和Load

来源: xiaoZ5919 分享至:

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上取就行了


Tags:
分享至:
最新图文资讯
1 2 3 4 5 6
验证码:点击我更换图片 理智评论文明上网,拒绝恶意谩骂 用户名:
关于我们 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 发展历史