- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Hibernate教程_169页
在Hibernate中,抽象类org.hibernate.dialect指定了所有底层数据库的对外统一接口。通过针对不同的数据库提供相应的dialect实现,数据库之间的差异性得以消除,从而为上层应用提供了透明的、与数据库无关的存储层基础。 对于分页机制,dialect接口定义一个getLimitString方法,专门用来返回分页SQL语句。 大多数主流关系数据库都提供了数据部分读取机制,Hibernate在实现dialect接口中的方法getLimitString时,都会采用相对应数据库里最佳性能的数据部分读取机制。比如,针对Oracle采用rownum子句的方法,针对MySQL采用limit来实现。 就算某些没有提供相应数据部分读取机制的数据库,Hibernate也通过其它途径来实现分页,比如使用JDBC2.0的Scrollable ResultSet,如果JDBC不支持Scrollable ResultSet,Hibernate也会自动通过ResultSet的next方法进行记录定位后再读取部分数据。 6.1.Hibernate分页机理 6.2.示例 示例: Criteria criteria=session.createCriteria(User.class); criteria.add(Restrictions.eq(“age”,”20”); criteria.setFirstResult(100); criteria.setMaxResults(20); 不管底层数据库是Oracle、DB2、SQL Server还是MySQL,Hibernate都会从检索结果中获取第100条记录开始的20条记录。 Session是Hibernate运行的灵魂,作为贯穿Hibernate应用的关键,Session包含了数据库操作相关的状态信息。有效的Session管理,是Hibernate应用设计的关键。 SessionFactory负责创建Session。SessionFactory是线程安全的,多个并发访问线程可以同时访问一个SessionFactory,并从中获取Session实例。 而Session并非线程安全。如果多个线程同时使用一个Session实例进行数据存取,则将导致Session数据存取逻辑混乱。 Session管理的主要目标:通过合理的设计,避免Session频繁创建和销毁,从而避免大量的内存开销和频繁的JVM垃圾回收,保证系统高效平稳运行。 Session管理原则:session用过后及时关闭 7.Session管理 ThreadLocal是Java中一种较为特殊的线程绑定机制。通过ThreadLocal存取的数据,总是与当前线程相关。JVM会为每个运行的线程,绑定了私有的本地实例存取空间,从而为多线程应用出现的并发访问问题提供了一种隔离机制。 其实现原理是在JVM中维护一个Map,这个Map的key就是当前的线程对象,而value则是线程通过ThreadLocal.set方法保存的对象实例。当线程调用ThreadLocal.get方法时,ThreadLocal会根据当前线程对象的引用,取出Map中对应的对象返回。 通过ThreadLocal实现的线程级别Session管理是目前Hibernate Sesssion管理的常见手段。也是Hibernate官方推荐的管理方式。 7.1.ThreadLocal模式 参考:HibernateUtil.java 问题:在View层访问user对象的addresses集合(使用延迟加载) 通常Hibernate应用于DAO/Service层,Session的使用也会放到DAO/Service层内进行管理,Session使用后会立即关闭,所以当使用Hibernate延迟加载特性时,通过需要在DAO/Service层把延迟加载数据进行即时加载,如 user.getAddresses (),否则当在View层使用user.getAddresses(),Hibernate抛session already closed Exception。因而不能充分利用Hibernate的延迟加载特性。 解决方案:Session不立即在DAO/Service层关闭,而是等Web层使用完后才关闭,也就是Open Session In View。 Open Session In View可以采用Servlet规范中的Filter机制来实现。 7.2.Open Session In View模式 实现机制: OpenSessionInViewFilter在Request时把session绑定到当前thread,期间一直保持session在open状态,使session在request的整个期间都可
您可能关注的文档
最近下载
- 天眼之父时代楷模学习南仁东精神PPT课件.pptx VIP
- 五笔打字教程.doc VIP
- IS580系列伺服驱动器用户手册.pdf
- 商法学(第五版)课件:公司与公司法概述.pptx
- 医院检验科副主任个人述职报告.pptx VIP
- 20241011-01 智能制造工业互联网数字化智能工厂解决方案(MES、WMS、ERP).pptx VIP
- GB50856-2013:通用安装工程工程量计算规范.pdf VIP
- 某中心校对强制或变相强制学生购买课外读物行为的管控制度.docx VIP
- 2024年12月大学英语四级考试真题合集(共3套).pdf VIP
- 国际人才英语教程 初级教学课件Unit 3.ppt VIP
原创力文档


文档评论(0)