Java学习笔记-《Java程序员面试宝典》-第5章Java Web-5.3框架(5.3.14-5.3.15)

5.3.14 什么是Hibernate

Hibernate是一个开放源码的对象关系映射(Object Relation Mapping,ORM,一种用来完成对象模型到关系模型的映射技术)框架,它不仅可以运行在J2EE容器中,也可以在J2EE容器外运行。它对JDBC进行了非常轻量级的对象封装,所以任何可以使用JDBC的地方都可以用Hibernate来替代。Hibernate实现了Java对象与关系数据库记录的映射关系,简化了开发人员访问数据库的流程,极大地提高了软件的开发效率。
Hibernate主要提供了5个核心接口,分别是Session、SessionFactory、Transation、Query和Configuration。通过使用这些接口不仅可以完成对数据库的访问(例如查询、插入、更新与删除等),而且还可以实现对事务的控制。Hibernate的结构图如下所示:
这里写图片描述
接下来是各模块的作用介绍:

  1. Session:一个轻量级的非线程安全的对象,主要负责被持久化对象与数据库的操作。可以使用SessionFactory来创建一个Session,当对数据库的所有操作都执行完后,就可以关闭Session,Session在访问数据库时会建立与数据库的连接,这个连接只有在需要时才会被建立
  2. SessionFactory:负责初始化Hibernate。它可以被看作数据源的代理,可以用来创建Session对象。此外,SessionFactory是线程安全的因此可以被多个线程同时访问。一般而言,SessionFactory会在Hibernate启动时创建一次,因此,为了便于使用,SessionFactory应该用一个单例模式来实现。
  3. Transation:负责事务相关的操作。它的主要方法有commit()和rollback(),其中commit()方法负责事务的提交,rollback()方法负责事物的回滚,可以通过Session的beginTransation()方法来创建。
  4. Query:负责执行各种数据库查询。可以使用Hibernate查询语言或SQL语言两种方式进行查询(这两种方法非常类似,与SQL不同的是,HQL语言使用类和属性而不是表与列名进行查询)。可以通过Session的createQuery()方法来创建Query。此外,Hibernate还提供了一种类型安全的面向对象的查询方式–QBC。
  5. Configuration:用于读取Hibernate配置文件,并生成SessionFactory对象。其中配置文件主要有两类:一种是hibernate.cfg.xml或hibernate.properties;另一种是映射文件,例如.hbm.xml。其中前者是用来配置Hibernate服务的信息(例如连接数据库的驱动类、数据库连接的URL、数据库的用户名和密码等信息)。映射文件(.hbm.xml)用来配置Java对象与关系数据库记录的映射关系。为了便于管理和维护,通常会给每个对象创建一个单独的映射文件。

    具体而言,使用Hibernate框架有诸多好处,主要表现为以下几个方面:
    1>提高开发效率
    2>使得开发可以完全采用面向对象的思想,不需要关心数据库的关系模型
    3>使用Hibernate开发的系统具有很好的移植性,可以很容易的实现不同数据库之间的移植而不需要关心不同数据库SQL语句的差异
    4>支持透明持久化,Hibernate的API没有侵入性,当保存一个对象时,这个对象不需要继承Hibernate中的任何类和实现任何接口
    虽然如此,但Hibernate只适用于针对单一对象简单的增、查、删、改,而对于批量的修改/删除场合,则不适用。这也是OR框架的缺点,所以当要使用数据库的特定优化机制时,不适合使用Hibernate。
    引申:
    1.在使用Hibernate时如何提高性能?
    答:1)延迟加载。当Hibernate从数据库获取某一对象数据、获取某一个对象的集合属性值时或者获取某一个对象所关联的另一个对象时,并不会立即从数据库中把数据加载到对象中,而是通过建立一个代理对象,把这个对象的属性都设置为默认值,只有当这些数据在被使用时才会从数据库中加载对应的数据,使用这种方法可以有效提高Hibernate的性能
    2)缓存技术。Hibernate中提供了一级缓存和二级缓存,合理的利用缓存也有助于提高系统的性能,为了避免不合理的缓存导致内存的过度消耗降低系统的性能,可以通过合理配置缓存的参数来避免这个问题。
    3)优化查询语句。通过优化查询语句来提高系统的性能。

2.Hibernate中怎么样实现类之间的关系?
类之间的关系主要体现在表之间的关系,他们都是对对象进行操作,程序中把所有表与对象映射在一起,他们通过配置文件中的many-to-one,one-to-many,many-to-many来进行配置

5.3.15 什么是Hibernate的二级缓存

缓存的目的是为了通过减少应用程序对物理数据源访问的次数来提高程序运行的效率,原理则是把当前或接下来一段时间可能会用到的数据保存到内存中,在使用时直接从内存中读取,而不是从硬盘中读取,简单来说,缓存就是数据库中数据在内存中的”临时容器”。
在Hibernate中,缓存用来把从数据库中查询出来的和使用过的对象保存在内存中,以便在后期需要用到这个对象时可以直接从缓存中获取这个对象(只有当该对象在缓存中不存在时才会去数据库中查询)。显然,由于避免了因大量发送SQL语句到数据库查询导致的性能损耗,缓存机制可以显著提高程序的运行效率。
在Hibernate中有一级缓存与二级缓存的概念,一级缓存由Session来管理,二级缓存由SessionFactory来管理。在使用时,二级缓存是可有可无的,但一级缓存是必不可少的。
一级缓存使用的场合如下:当使用Session查询数据时,首先会在该Session内部查找该对象是否存在,若存在,则直接返回,否则,就到数据库中去查询,并将查询的结果缓存起来以便后期使用。一级缓存的缺点就是当Session来表示一次会话时,它的生命周期较短,而且它是线程不安全的,不能被多个线程共享,因此,在实际使用时,对效率的提升不是非常明显。
鉴于以上原因,二级缓存的概念被引入。二级缓存用来为Hibernate配置一种全局的缓存,以便实现多个线程与事务共享。在使用了二级缓存后,当查询数据时,会首先在内部缓存中去查找,如果不存在,接着在二级缓存中查找,最后才去数据库中查找。与一级缓存相比,二级缓存是独立于Hibernate的软件部件,属于第三方产品,Hibernate 3以后默认使用的产品为EhCache。在使用时,可以根据需求通过配置二级缓存插件来实现二级缓存功能,Hibernate为了集成这些插件,提供了org.hibernate.cache.CacheProvider接口来充当缓存插件与Hibernate之间的适配器。当然,二级缓存除了以内存作为存储介质外,还可以选用硬盘等外部存储设备。
合理的使用Hibernate的二级缓存机制有助于提高系统的运行效率,但是如果使用得不合理,不仅不会提高效率,反而有可能会降低系统的性能。
二级缓存一般适用于以下几种情况:
1>数据量小。如果数据量太大,缓存太多,会消耗大量内存,造成内存资源短缺,从而降低系统的性能。
2>对数据的修改较小。如果进行大量的修改,就需要频繁的对缓存中数据与数据库中的数据进行同步,而这也会影响系统的性能。
3>不会被大量的应用共享的数据。如果数据被大量线程或事物共享,多线程访问时的同步机制也会影响系统的性能
4>不是很重要的数据。如果查询的数据非常重要,对数据的正确性的要求非常高,最好不要用二级缓存。

猜你喜欢

转载自blog.csdn.net/qq_28814687/article/details/77370121