A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

比较Hibernate的三种检索策略优缺点
1立即检索;立即加载检索方法指定的对象
优点:对应用程序完全透明,不管对象处于持久化状态,还是游离状态,应用程序都可以方便的从一个对象导航到与它关联的对象;
缺点:1.select语句太多;2.可能会加载应用程序不需要访问的对象白白浪费许多内存空间;
2延迟检索:延迟加载检索方法指定的对象
优点:由应用程序决定需要加载哪些对象,可以避免可执行多余的select语句,以及避免加载应用程序不需要访问的对象。因此能提高检索性能,并且能节省内存空间;
缺点:应用程序如果希望访问游离状态代理类实例,必须保证他在持久化状态时已经被初始化;
3 迫切左外连接检索
优点:1对应用程序完全透明,不管对象处于持久化状态,还是游离状态,应用程序都可以方便地冲一个对象导航到与它关联的对象。2使用了外连接,select语句数目少;
缺点:1 可能会加载应用程序不需要访问的对象,白白浪费许多内存空间;2复杂的数据库表连接也会影响检索性能;
Hibernate框架提供的两级缓存结构中,一级缓存和二级缓存有什么区别?
    一级缓存的生命周期和session的生命周期一致,当前session一旦关闭,一级缓存就消失了,因此一级缓存也叫session级的缓存或事务级缓存,一级缓存只存实体对象,它不会缓存一般的对象属性,即当获得对象后,就将该对象缓存起来,如果在同一session中再去获取这个对象时,它会先判断在缓存中有没有该对象的id,如果有则直接从缓存中获取此对象,反之才去数据库中取,取的同时再将此对象作为一级缓存处理。
   二级缓存也称进程级的缓存或SessionFactory级的缓存,二级缓存可以被所有session共享,二级缓存的生命周期和SessionFactory的生命周期一致。hibernate为实现二级缓存,只提供二级缓存的接口供第三方实现。二级缓存也是缓存实体对象,原理和方法都与一级缓存差不多,只是生命周期有所差异。
Hibernate中DetachedCriteria类是做什么的?
    DetachedCriteria和Criteria的用法基本上是一致的,但Criteria是由Session的createCriteria()方法创建的,也就意味着离开创建它的Session,Criteria就无法使用了。DetachedCriteria不需要Session就可以创建(使用DetachedCriteria.forClass()方法创建),所以通常也称其为离线的Criteria,在需要进行查询操作的时候再和Session绑定(调用其getExecutableCriteria(Session)方法),这也就意味着一个DetachedCriteria可以在需要的时候和不同的Session进行绑定。
Criteria 和 DetachedCriteria 的主要区别
Criteria 和 DetachedCriteria 的主要区别在于创建的形式不一样,
Criteria 是在线的,所以它是由 Session 进行创建的;而 DetachedCriteria 是离线的,创建时无需Session。
   Spring 的框架提供了getHibernateTemplate().findByCriteria(detachedCriteria) 方法可以很方便地根据DetachedCriteria 来返回查询结果。
Hibernate的性能优化
1.尽量使用延迟加载特性。不需要什么字段都采用lazy load的方式。对于一些基本属性的字段,建议采用lazy load,而对于一些可能需要消耗内存的字段,建议将其lazy属性设置为true,对于集合,则全部设置为true
2.制定合理的缓存策略(二级缓存、查询缓存)。
3.开发完成后关闭hibernate.show_sql选项。
4.考虑数据库本身的优化,合理的索引、恰当的数据分区策略等都会对持久层的性能带来可观的提升,但这些需要专业的DBA(数据库管理员)提供支持。
要将Session对象中进行的操作立即同步在数据库中,应该怎么实现?
调用Session对象的flush()方法,刷新一级缓存区的内容,使之立即与数据库数据保持同步,无需等到事务提交时再同步数据库。
Hibernate的并发机制?如何处理并发问题?
(线程安全:就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。
线程不安全:就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据)
Hibernate并发机制:
   a、Hibernate的Session对象是非线程安全的,对于单个请求,单个会话,单个的工作单元(即单个事务,单个线程),它通常只使用一次,然后就丢弃。
      如果一个Session 实例允许共享的话,那些支持并发运行的,例如Http request,session beans将会导致出现资源争用。
      如果在Http Session中有hibernate的Session的话,就可能会出现同步访问Http Session。只要用户足够快的点击浏览器的“刷新”, 就会导致两个并发运行的线程使用同一个Session。
   b、多个事务并发访问同一块资源,可能会引发第一类丢失更新,脏读,幻读,不可重复读,第二类丢失更新一系列的问题。
   解决方案:设置事务隔离级别。
                                       Serializable:串行化。隔离级别最高
                             Repeatable Read:可重复读
                             Read Committed:已提交数据读
                             Read Uncommitted:未提交数据读。隔离级别最差       
   


1 个回复

倒序浏览
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马