Session.find()步骤

本文深入探讨了在Hibernate框架下Session.find()和Session.iterate()方法的区别与性能影响。重点阐述了这两种方法在查询机制、缓存利用和内存管理方面的差异,并提供了在不同场景下选择合适方法的策略,旨在提高系统性能。

来自:http://www.verydemo.com/demo_c146_i21367.html

Session.find()方法
查询性能往往是系统性能表现的一个重要方面,查询机制的优劣很大程度上决定了系统的整体性能。这个领域往往也存在最大的性能调整空间。

hibernate2中Session.find()对应于3中的session.createQuery().list();
hibernate2中Session.iterate()对应于3中的session.createQuery().iterate();
find和iterate区别:
find方法通过一条Select SQL实现了查询操作,而iterate方法要执行多条Select SQL.
iterate第一次查询获取所有符合条件的记录的id,然后再根据各个id从库表中读取对应的记录,这是一个典型的N+1次的查询问题,如果符合条件记录有10000条,就需要执行10001条Select SQL,可想性能会如何的差。

那为什么要提供iterator方法,而不只是提供高效率的find方法?

原因1.与hibernate缓存机制密切相关
find方法实际上是无法利用缓存的,它对缓存只写不读。
find方法只执行一次SQL查询,它无法判断缓存中什么样的数据是符合条件的,也无法保证查询结果的完整性。而iterate方法,会首先查询所有符合条件记录的id,然后根据id去缓存中找,如果缓存中有该id,就返回,没有可以根据id再去数据库查询。
String hql = "from TUser where age > ?";
List userList = session.find(hql, new Integer(18), Hibernate.INTEGER);
Iterator it = session.iterate(hql, new Integer(18), Hibernate.INTEGER);
顺序执行,iterate方法只会执行一次SQL查询,就是查找id,然后根据id就可以从缓存中获得数据。

String hql = "from TUser where age > ?";
List userList = session.find(hql, new Integer(18), Hibernate.INTEGER);
userList = session.find(hql, new Integer(18), Hibernate.INTEGER);
缓存是不起作用的。
如果目标数据读取相对较为频繁,通过iterate这种机制,会减少性能损耗。

原因2.内存使用上的考虑
find方法将一次获得的所有记录并将其读入内存。如果数据量太大,可能会触发OutOfMemoryError,从而导致系统异常。解决方案之一就是结合iterate方法和evict方法逐条对记录进行处理,将内存消化保持在一个可以接受的范围之内。如:
String hql = "from TUser where age > ?";
Iterator it = session.iterate(hql, new Integer(18), Hibernate.INTEGER);
while(it.hasNext()) {
    TUser user = (TUser)it.next();
   
    //将对象从一级缓存中删除
    session.evict(user);

    //二级缓存可以设定最大缓存量,达到后自动对较老数据进行废除,但也可以通过编
    //码移除,这样有助于保持数据有效性。
    sessionFactory.evict(TUser.class, user.getID());
}
Intern25_2@79d153e3ced3:/$ export DISPLAY=:1 Intern25_2@79d153e3ced3:/$ mkdir -p ~/.fluxbox mkdir: cannot create directory '/remote-home/Intern25_2/.fluxbox': Permission denied Intern25_2@79d153e3ced3:/$ sudo mkdir -p ~/.fluxbox mkdir: cannot create directory '/remote-home/Intern25_2/.fluxbox': No space left on device Intern25_2@79d153e3ced3:/$ fluxbox & [2] 5370 Intern25_2@79d153e3ced3:/$ Can't create directory /remote-home/Intern25_2/.fluxbox Failed to load database: /remote-home/Intern25_2/.fluxbox/init Failed to load database:/remote-home/Intern25_2/.fluxbox/init Retrying with: /etc/X11/fluxbox/init Failed to read: session.ignoreBorder Setting default value Failed to read: session.forcePseudoTransparency Setting default value Failed to read: session.colorsPerChannel Setting default value Failed to read: session.doubleClickInterval Setting default value Failed to read: session.tabPadding Setting default value Failed to read: session.styleOverlay Setting default value Failed to read: session.slitlistFile Setting default value Failed to read: session.appsFile Setting default value Failed to read: session.tabsAttachArea Setting default value Failed to read: session.cacheLife Setting default value Failed to read: session.cacheMax Setting default value Failed to read: session.autoRaiseDelay Setting default value Failed to read: session.screen0.opaqueMove Setting default value Failed to read: session.screen0.fullMaximization Setting default value Failed to read: session.screen0.maxIgnoreIncrement Setting default value Failed to read: session.screen0.maxDisableMove Setting default value Failed to read: session.screen0.maxDisableResize Setting default value Failed to read: session.screen0.workspacewarping Setting default value Failed to read: session.screen0.showwindowposition Setting default value Failed to read: session.screen0.autoRaise Setting default value Failed to read: session.screen0.clickRaises Setting default value Failed to read: session.screen0.defaultDeco Setting default value Failed to read: session.screen0.tab.placement Setting default value Failed to read: session.screen0.windowMenu Setting default value Failed to read: session.screen0.noFocusWhileTypingDelay Setting default value Failed to read: session.screen0.workspaces Setting default value Failed to read: session.screen0.edgeSnapThreshold Setting default value Failed to read: session.screen0.window.focus.alpha Setting default value Failed to read: session.screen0.window.unfocus.alpha Setting default value Failed to read: session.screen0.menu.alpha Setting default value Failed to read: session.screen0.menuDelay Setting default value Failed to read: session.screen0.tab.width Setting default value Failed to read: session.screen0.tooltipDelay Setting default value Failed to read: session.screen0.allowRemoteActions Setting default value Failed to read: session.screen0.clientMenu.usePixmap Setting default value Failed to read: session.screen0.tabs.usePixmap Setting default value Failed to read: session.screen0.tabs.maxOver Setting default value Failed to read: session.screen0.tabs.intitlebar Setting default value Failed to read: session.screen0.focusModel Setting default value Failed to read: session.screen0.tabFocusModel Setting default value Failed to read: session.screen0.focusNewWindows Setting default value Failed to read: session.screen0.focusSameHead Setting default value Failed to read: session.screen0.rowPlacementDirection Setting default value Failed to read: session.screen0.colPlacementDirection Setting default value Failed to read: session.screen0.windowPlacement Setting default value Failed to load database:/remote-home/Intern25_2/.fluxbox/init Retrying with: /etc/X11/fluxbox/init Failed to read: session.ignoreBorder Setting default value Failed to read: session.forcePseudoTransparency Setting default value Failed to read: session.colorsPerChannel Setting default value Failed to read: session.doubleClickInterval Setting default value Failed to read: session.tabPadding Setting default value Failed to read: session.styleOverlay Setting default value Failed to read: session.slitlistFile Setting default value Failed to read: session.appsFile Setting default value Failed to read: session.tabsAttachArea Setting default value Failed to read: session.cacheLife Setting default value Failed to read: session.cacheMax Setting default value Failed to read: session.autoRaiseDelay Setting default value Failed to read: session.screen0.opaqueMove Setting default value Failed to read: session.screen0.fullMaximization Setting default value Failed to read: session.screen0.maxIgnoreIncrement Setting default value Failed to read: session.screen0.maxDisableMove Setting default value Failed to read: session.screen0.maxDisableResize Setting default value Failed to read: session.screen0.workspacewarping Setting default value Failed to read: session.screen0.showwindowposition Setting default value Failed to read: session.screen0.autoRaise Setting default value Failed to read: session.screen0.clickRaises Setting default value Failed to read: session.screen0.defaultDeco Setting default value Failed to read: session.screen0.tab.placement Setting default value Failed to read: session.screen0.windowMenu Setting default value Failed to read: session.screen0.noFocusWhileTypingDelay Setting default value Failed to read: session.screen0.workspaces Setting default value Failed to read: session.screen0.edgeSnapThreshold Setting default value Failed to read: session.screen0.window.focus.alpha Setting default value Failed to read: session.screen0.window.unfocus.alpha Setting default value Failed to read: session.screen0.menu.alpha Setting default value Failed to read: session.screen0.menuDelay Setting default value Failed to read: session.screen0.tab.width Setting default value Failed to read: session.screen0.tooltipDelay Setting default value Failed to read: session.screen0.allowRemoteActions Setting default value Failed to read: session.screen0.clientMenu.usePixmap Setting default value Failed to read: session.screen0.tabs.usePixmap Setting default value Failed to read: session.screen0.tabs.maxOver Setting default value Failed to read: session.screen0.tabs.intitlebar Setting default value Failed to read: session.screen0.focusModel Setting default value Failed to read: session.screen0.tabFocusModel Setting default value Failed to read: session.screen0.focusNewWindows Setting default value Failed to read: session.screen0.focusSameHead Setting default value Failed to read: session.screen0.rowPlacementDirection Setting default value Failed to read: session.screen0.colPlacementDirection Setting default value Failed to read: session.screen0.windowPlacement Setting default value Failed to read: session.screen0.slit.acceptKdeDockapps Setting default value Failed to read: session.screen0.slit.autoHide Setting default value Failed to read: session.screen0.slit.maxOver Setting default value Failed to read: session.screen0.slit.placement Setting default value Failed to read: session.screen0.slit.alpha Setting default value Failed to read: session.screen0.slit.onhead Setting default value Failed to read: session.screen0.slit.layer Setting default value failed to open apps file Failed to read: session.screen0.toolbar.autoHide Setting default value Failed to read: session.screen0.toolbar.maxOver Setting default value Failed to read: session.screen0.toolbar.visible Setting default value Failed to read: session.screen0.toolbar.alpha Setting default value Failed to read: session.screen0.toolbar.layer Setting default value Failed to read: session.screen0.toolbar.onhead Setting default value Failed to read: session.screen0.toolbar.placement Setting default value Failed to read: session.screen0.toolbar.height Setting default value Failed to read: session.screen0.iconbar.mode Setting default value Failed to read: session.screen0.iconbar.alignment Setting default value Failed to read: session.screen0.iconbar.iconWidth Setting default value Failed to read: session.screen0.iconbar.iconTextPadding Setting default value Failed to read: session.screen0.iconbar.usePixmap Setting default value mkdir: cannot create directory '/remote-home/Intern25_2/.fluxbox': Permission denied touch: cannot touch '/remote-home/Intern25_2/.fluxbox/lastwallpaper': No such file or directory feh WARNING: Can't write to /remote-home/Intern25_2/.fehbg /usr/bin/fbsetbg: 159: cannot create /remote-home/Intern25_2/.fluxbox/lastwallpaper.tmp: Directory nonexistent mv: cannot stat '/remote-home/Intern25_2/.fluxbox/lastwallpaper.tmp': No such file or directory /usr/bin/fbsetbg: 168: cannot create /remote-home/Intern25_2/.fluxbox/lastwallpaper: Directory nonexistent
最新发布
11-21
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值