文章目录

      • 1、Hibernate 中对象的三种状态及如何切换
        • 1.1 三种状态介绍
        • 1.2 三种状态的切换
      • 2、Hibernate 的缓存机制
        • 2.1 Hibernate缓存原理
        • 2.2 Hibernate的一、二级缓存策略
        • 2.3 二级缓存的使用
        • 2.4 常用的二级缓存插件
      • 3、Hibernate 的查询方式有哪些
        • 3.1 HQL
        • 3.2 QBC
        • 3.3 原生SQL
      • 4、Hibernate和 Mybatis 的区别
        • 4.1 ORM 的工作原理
        • 4.2 两者的差别
        • 4.3 两者的优势
      • 5、Hibernate 和 JDBC 优缺点对比
        • 5.1 JDBC的优缺点
        • 5.2 Hibernate的优缺点
        • 5.3 两者的差异
      • 6、JDBC、hibernate 和 ibatis 的区别
      • 7、讲下Hibernate 的 orm 思想
      • 8、get 和 load 的区别
      • 9、如何进行 Hibernate 的优化
        • 9.1 数据库设计
        • 9.2 HQL优化
        • 9.3 缓存
        • 9.4 结果集的使用
        • 9.5 主配置
        • 9.6 延迟加载
        • 9.7 事务控制
      • 10、什么是 Hibernate 延迟加载
      • 11、比较 Hibernate 三种检索策略的优缺点
      • 12、简述一下 hibernate 的开发流程
      • 13、Hibernate工作原理及为什么要用
        • 13.1 原理
        • 13.2 为什么要用
      • 14、Hibernate是如何延迟加载(懒加载)
      • 15、Hibernate中怎样实现类之间的关系
      • 16、Hibernate里面的sorted collection 和ordered collection有什么区别
      • 17、在数据库中条件查询速度很慢的时候,如何优化
      • 18、SessionFactory是线程安全么
      • 19、persist和save的区别
      • 20、常见的主键生成策略有哪些
      • 21、简述hibernate中getCurrentSession和openSession区别
      • 22、为什么在Hibernate的实体类中要提供一个无参数的构造器这一点非常重要
      • 23、谈谈Hibernate中inverse的作用
      • 24、Hibernate如何实现数据表映射的继承关系
      • 25、在hibernate中进行多表查询,每个表中各取几个字段,也就是说查询出来的结果集并没有一个实体类与之对应,如何解决这个问题

1、Hibernate 中对象的三种状态及如何切换

1.1 三种状态介绍

  • 1、瞬时态(临时态、自由态)
      比如通过Java的new关键字来生成一个实体对象时,这时这个实体对象就处于自由状态:
Person person = new Person("zhangsan");

  这时该Person对象就处于自由状态,因为,此时person只是通过JVM获得了一块内存空间,还并没有通过Session对象的save()方法保存进数据库,因此也就还没有纳入Hibernate的缓存管理中,也就是说customer对象现在还自由的游荡于Hibernate缓存管理之外。所以我们可以看出自由对象最大的特点就是,在数据库中不存在一条与它对应的记录。
  瞬时对象特点:
    (1) 不和 Session 实例关联
    (2) 在数据库中没有和瞬时对象关联的记录

  • 2、持久态
      持久化对象就是已经被保存进数据库的实体对象,并且这个实体对象现在还处于Hibernate的缓存管理之中。这是对该实体对象的任何修改,都会在清理缓存时同步到数据库中,示例:
Person person = new Person("zhangsan");		//new一个Person对象
tx=session.beginTransaction();		//开启事务
session.save(person);			//将customer持久化到数据库中
person=(Person)session.load(person.class,1);	//根据id查出Person zhangsan
person.setAge(28);		//修改Person的年龄为28
tx.commit();		//提交事务

  我们并没有显示调用session.update()方法来保存更新,但是对实体对象的修改还是会同步更新到数据库中,因为此时customer对象通过save方法保存进数据库后,已经是持久化对象了,然后通过load方法再次加载它,它仍然是持久化对象,所以它还处于Hibernate缓存的管理之中,这时当执行tx.commit()方法时,Hibernate会自动清理缓存,并且自动将持久化对象的属性变化同步到到数据库中。
  持久的实例在数据库中有对应的记录,并拥有一个持久化标识 (identifier)。
持久对象总是与 Session 和 Transaction 相关联,在一个 Session 中,对持久对象的改变不会马上对数据库进行变更,而必须在 Transaction 终止,也就是执行 commit() 之后,才在数据库中真正运行 SQL 进行变更,持久对象的状态才会与数据库进行同步。
  瞬时对象转为持久对象:
   (1) 通过 Session 的 save() 和 saveOrUpdate() 方法把一个瞬时对象与数据库相关联,这个瞬时对象就成为持久化对象。
   (2) 使用 fine(),get(),load() 和 iterater() 等方法查询到的数据对象,将成为持久化对象。
  持久化对象的特点:
   (1) 和 Session 实例关联
   (2) 在数据库中有和持久对象关联的记录

  • 3、脱管态(离线态、游离态)
      当一个持久化对象,脱离开Hibernate的缓存管理后,它就处于游离状态,游离对象和自由对象的最大区别在于,游离对象在数据库中可能还存在一条与它对应的记录,只是现在这个游离对象脱离了Hibernate的缓存管理,而自由对象不会在数据库中出现与它对应的数据记录。示例:
Person person = new Person("zhangsan");		
tx=session.beginTransaction();		
session.save(person);			
person=(Person)session.load(person.class,1);	
person.setAge(28);		
tx.commit();		
session.close();		//关闭session

  当session关闭后,customer对象就不处于Hibernate的缓存管理之中了,但是此时在数据库中还存在一条与customer对象对应的数据记录,所以此时customer对象处于游离状态。
  与持久对象关联的 Session 被关闭后,对象就变为脱管对象。对脱管对象的引用依然有效,对象可继续被修改。
  脱管对象特点:
   (1) 本质上和瞬时对象相同
   (2) 只是比爱瞬时对象多了一个数据库记录标识值 id.(存在过数据库的证明)

1.2 三种状态的切换

  直接new出来的对象就是临时/瞬时状态的,此时该对象还没有被持久化(没有保存在数据库中),不受Session的管理。
  当保存在数据库中的对象就是持久化状态,比如调用调用session的save /saveOrUpdate /get /load /list等方法时。
  当Session关闭了以后,持久化的对象就变成了游离状态。
  三种状态的转换图示:

  简而言之,new出来的对象是瞬时状态->保存到数据库中(受Session管理)就是持久化状态->将session close掉就是游离状态

2、Hibernate 的缓存机制

2.1 Hibernate缓存原理

  对于Hibernate这类ORM而言,缓存显的尤为重要,它是持久层性能提升的关键.简单来讲Hibernate就是对JDBC进行封装,以实现内部状态的管理,OR关系的映射等,但随之带来的就是数据访问效率的降低,和性能的下降,而缓存就是弥补这一缺点的重要方法。
  缓存就是数据库数据在内存中的临时容器,包括数据库数据在内存中的临时拷贝,它位于数据库与数据库访问层中间。ORM在查询数据时首先会根据自身的缓存管理策略,在缓存中查找相关数据,如发现所需的数据,则直接将此数据作为结果加以利用,从而避免了数据库调用性能的开销.而相对内存操作而言,数据库调用是一个代价高昂的过程。
  一般来讲ORM中的缓存分为以下几类:

  • 1、事务级缓存
      即在当前事务范围内的数据缓存。就Hibernate来讲,事务级缓存是基于Session的生命周期实现的,每个Session内部会存在一个数据缓存,它随着 Session的创建而存在,随着Session的销毁而灭亡,因此也称为Session Level Cache。
  • 2、应用级缓存
      即在某个应用中或应用中某个独立数据库访问子集中的共享缓存,此缓存可由多个事务共享(数据库事务或应用事务),事务之间的缓存共享策略与应用的事务隔离机制密切相关。在Hibernate中,应用级缓存由SessionFactory实现,所有由一个SessionFactory创建的 Session实例共享此缓存,因此也称为SessionFactory Level Cache。
  • 3、分布式缓存
      即在多个应用实例,多个JVM间共享的缓存策略。分布式缓存由多个应用级缓存实例组成,通过某种远程机制(RMI,JMS)实现各个缓存实例间的数据同步,任何一个实例的数据修改,将导致整个集群间的数据状态同步。

2.2 Hibernate的一、二级缓存策略

  Hibernate中提供了两级Cache,第一级别的缓存是Session级别的缓存,它是属于事务范围的缓存。这一级别的缓存由hibernate管理的,一般情况下无需进行干预;第二级别的缓存是SessionFactory级别的缓存,它是属于进程范围或群集范围的缓存。这一级别的缓存可以进行配置和更改,并且可以动态加载和卸载,属于多事务级别,要防止事务并发性。
  缓存是以map的形式进行存储的(key-id,value-object)。

  • 1、一级缓存(Session)
      事务范围,每个事务(Session)都有单独的第一级缓存。
      一级缓存的管理:当应用程序调用Session的save()、update()、saveOrUpdate()、get()或load(),以及调用查询接口的 list()、iterate()–(用的是n+1次查询,先查id)或filter()方法时,如果在Session缓存中还不存在相应的对象,Hibernate就会把该对象加入到第一级缓存中。当清理缓存时,Hibernate会根据缓存中对象的状态变化来同步更新数据库。 Session为应用程序提供了两个管理缓存的方法: evict(Object obj):从缓存中清除参数指定的持久化对象。 clear():清空缓存中所有持久化对象,flush():使缓存与数据库同步。
      当查询相应的字段如(name),而不是对象时,不支持缓存。
  • 2、二级缓存(SessionFactory)
      Hibernate的二级缓存策略的一般过程如下:
       1>条件查询的时候,总是发出一条select * from table_name where …. (选择所有字段)这样的SQL句查询数据库,一次获得所有的数据对象(这个问题要考虑,如果你查询十万条数据时,内存不是被占用)。
       2>把获得的所有数据对象根据ID放入到第二级缓存中。
       3>当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;查不到,再查询数据库,把结果按照ID放入到缓存。
       4>删除、更新、增加数据的时候,同时更新缓存。
      Hibernate的二级缓存策略,是针对于ID查询的缓存策略,对于条件查询则毫无作用。为此,Hibernate提供了针对条件查询的Query Cache。

2.3 二级缓存的使用

  • 1、什么样的数据适合存放到第二级缓存中?
      很少被修改的数据
      不是很重要的数据,允许出现偶尔并发的数据
      不会被并发访问的数据
      参考数据,指的是供应用参考的常量数据,它的实例数目有限,它的实例会被许多其他类的实例引用,实例极少或者从来不会被修改。
  • 2、不适合存放到第二级缓存的数据?
      经常被修改的数据
      财务数据,绝对不允许出现并发
      与其他应用共享的数据。

2.4 常用的二级缓存插件

  常用的缓存插件 Hibernater 的二级缓存是一个插件,下面是几种常用的缓存插件:
   1>EhCache
    可作为进程范围的缓存,存放数据的物理介质可以是内存或硬盘,对Hibernate的查询缓存提供了支持。
   2>OSCache
    可作为进程范围的缓存,存放数据的物理介质可以是内存或硬盘,提供了丰富的缓存数据过期策略,对Hibernate的查询缓存提供了支持。
   3>SwarmCache
    可作为群集范围内的缓存,但不支持Hibernate的查询缓存。
   4>JBossCache
    可作为群集范围内的缓存,支持事务型并发访问策略,对Hibernate的查询缓存提供了支持。

3、Hibernate 的查询方式有哪些

  Hibernate 的查询方式常见的主要分为三种: HQL(Hibernate Query Language), QBC(Query By Criteria,命名查询), 以及使用原生 SQL 查询(Sql Query)。

3.1 HQL

  HQL是一种偏向于面向对象的查询方式,示例:

        String name = "iphone";Query q =s.createQuery("from Product p where p.name like ?");q.setString(0, "%"+name+"%");List<Product> ps= q.list();

3.2 QBC

  QBC是一种完全面向对象的查询方式,示例:

        String name = "iphone";Criteria c= s.createCriteria(Product.class);c.add(Restrictions.like("name", "%"+name+"%"));List<Product> ps = c.list();

3.3 原生SQL

  使用原生SQL语句查询方式的示例:

        String name = "iphone";String sql = "select * from product_ p where p.name like '%"+name+"%'";Query q= s.createSQLQuery(sql);List<Object[]> list= q.list();

4、Hibernate和 Mybatis 的区别

  Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,建立对象与数据库表的映射。是一个全自动的、完全面向对象的持久层框架。
  Mybatis是一个开源对象关系映射框架,是一个半自动化的持久层框架。
  Hibernate和MyBatis都支持JDBC和JTA事务处理
  两者都是ORM框架,所以在了解两者的差别之前,我们有必要先简单认识一下ORM。

4.1 ORM 的工作原理

  1. 以一定的映射方式,把实体模型和数据库关系的映射
  2. ORM框架启动时加载这些映射和数据库配置文件
  3. ORM通过对原生jdbc的封装提供更加便利的操作
  4. Dao通过ORM提供便捷API对象的方式操作数据库关系

4.2 两者的差别

  • 1、两者最大的区别
      针对简单逻辑,Hibernate与MyBatis都有相应的代码生成工具,可以生成简单基本的DAO层方法。
      针对高级查询,MyBatis需要手动编写SQL语句,以及ResultMap,而Hibernate有良好的映射机制,开发者无需关心SQL的生成与结果映射,可以更专注于流程。
  • 2、开发难度对比
      Hibernate的开发难度大于MyBatis,主要由于Hibernate比较复杂,庞大,学习周期比较长。
      MyBatis则相对简单,并且MyBatis主要依赖于SQL的书写,让开发者刚进更熟悉。
  • 3、sql书写比较
      Hibernate也可以自己写sql来指定需要查询的字段,但这样就破坏了Hibernate开发的简洁性,不过Hibernate具有自己的日志统计。
      MyBatis的sql是手动编写的,所以可以按照要求指定查询的字段,不过没有自己的日志统计,所以要借助Log4j来记录日志。
  • 4、数据库扩展性计较
      Hibernate与数据库具体的关联在XML中,所以HQL对具体是用什么数据库并不是很关心
      MyBatis由于所有sql都是依赖数据库书写的,所以扩展性、迁移性比较差。
  • 5、对象管理比对
      Hibernate 是完整的对象-关系映射的框架,开发工程中,无需过多关注底层实现,只要去管理对象即可;
      Mybatis 需要自行管理 映射关系;
  • 6、sql优化方面
      Hibernate 自动生成sql,有些语句较为繁琐,会多消耗一些性能;
      Mybatis 手动编写sql,可以避免不需要的查询,提高系统性能;
  • 7、缓存机制比较
      Hibernate的二级缓存配置在SessionFactory生成配置文件中进行详细配置,然后再在具体的表对象映射中配置那种缓存。
      MyBatis的二级缓存配置都是在每个具体的表对象映射中进行详细配置,这样针对不同的表可以自定义不同的缓冲机制,并且MyBatis可以在命名空间中共享相同的缓存配置和实例,通过Cache-ref来实现。
      两者比较,因为Hibernate对查询对象有着良好的管理机制,用户无需关心SQL,所以在使用二级缓存时如果出现脏数据,系统会报出错误提示。 而MyBatis在这一方面使用二级缓存时需要特别小心,如果不能完全去掉数据更新操作的波及范围,避免cache的盲目使用,否则,脏数据的出现会给系统的正常运行带来很大的隐患。

4.3 两者的优势

  • 1、Mybatis优势
      MyBatis可以进行更为细致的SQL优化,可以减少查询字段。
      MyBatis容易掌握,而Hibernate门槛较高。
  • 2、Hibernate优势
      Hibernate的DAO层开发比MyBatis简单,Mybatis需要维护SQL和结果映射。
      Hibernate对对象的维护和缓存要比MyBatis好,对增删改查的对象的维护要方便。
      Hibernate数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL。
      Hibernate有更好的二级缓存机制,可以使用第三方缓存。MyBatis本身提供的缓存机制不佳。

5、Hibernate 和 JDBC 优缺点对比

5.1 JDBC的优缺点

  • 1、JDBC的优点
      因为是底层操作所以效率高
  • 2、JDBC的缺点
      1)代码繁琐
      2)不是面向对象的数据库操作
      3)资源关闭的代码也很繁琐
      4)没有做到数据库缓存
      5)移植性比较差(MySQL无法移植到Oracle)

5.2 Hibernate的优缺点

  • 1、Hibernate的优点
      1)代码比较精简
      2)是面向对象的数据库操作
      3)只需要关闭一个对象就可以了(关闭Session)
      4)数据缓存 (一级缓存、二级缓存、查询缓存)
      5)移植性比较好
  • 2、Hibernate的缺点:
      1)程序员无法控制SQL语句的生成 (HQL语句可以手写SQL语句)
      2)一个项目对SQL语句优化特别高,HIbernate则不适合
      3)如果一张表的数据量特别大,则不适合HIbernate

5.3 两者的差异

  两者相同点:
   1>两者都是 java 数据库操作的中间件。
   2>两者对数据库进行直接操作的对象都是线程不安全的,都需要及时关闭。
   3>两者都可对数据库的更新操作进行显式的事务处理。
  两者不同点:
   1>JDBC 是 SUN 公司提供一套操作数据库的规范,使用 java 代码操作数据库。Hibernate 是一个基于 jdbc 的主流持久化框架,对 JDBC 访问数据库的代码做了封装。
   2>使用的 SQL 语言不同:JDBC 使用的是基于关系型数据库的标准 SQL 语言,Hibernate 使用的是 HQL(Hibernatequery language)语言。
   3>操作的对象不同:JDBC 操作的是数据,将数据通过 SQL 语句直接传送到数据库中执行,Hibernate 操作的是持久化对象,由底层持久化对象的数据更新到数据库中。
   4>数据状态不同:JDBC 操作的数据是“瞬时”的,变量的值无法与数据库中的值保持一致,而 Hibernate 操作的数据是可持久的,即持久化对象的数据属性的值是可以跟数据库中的值保持一致的。

6、JDBC、hibernate 和 ibatis 的区别

  • 1、jdbc(手动)
      手动写sql;
      delete、insert、update要将对象的值一个一个取出传到sql中,不能直接传入一个对象;
       select:返回的是一个Resultset,要从ResultSet中一行一行、一个字段一个字段的取出,然后封装到一个对象中,不直接返回一个对象。
  • 2、ibatis(Mybatis的前身,半自动化)
      sql要手动写;
    ;  delete、insert、update:直接传入一个对象;
      select:直接返回一个对象。
  • 3、hibernate:(全自动)
      不写sql,自动封装;
      delete、insert、update:直接传入一个对象;
      select:直接返回一个对象。

7、讲下Hibernate 的 orm 思想

  ORM 指的是对象关系型映射(Object RelationShip Mapping ),指的就是我们通过创建实体类对象和数据库中的表关系进行一一对应,来实现通过操作实体类对象来更改数据库里边的数据信息。起到关键作用的是通过Hibernate 的映射文件+Hibernate 的核心配置文件,接下来以一个例子来看下这两个文件。
  假如有一个实体类Product:

public class Product {int id;String name;float price;public int getId() { return id; }public void setId(int id) { this.id = id; }public String getName() {  return name; }public void setName(String name) { this.name = name; }public float getPrice() { return price; }public void setPrice(float price) {  this.price = price; }  
}

  我们就可以在该文件对应的package目录下创建一个 实体类名.hbm.xml文件(在该例子中即Product.hbm.xml),用来映射数据库中的表和实体类之间的关系,该文件的简单语法是:

 <class name="实体类名" table="实体类对应的数据库中表名"><id name="id" column="表主键字段名" type="java.lang.Integer"><generator class="设置主键生成策略类型"/></id><property></property>
</class>

  Product.hbm.xml文件的内容示例:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC"-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping package="com.how2java.pojo"><class name="Product" table="product_"><id name="id" column="id"><generator class="native"></generator></id><property name="name" /><property name="price" /></class>
</hibernate-mapping>

  上面内容的意思是:Product类对应数据库中的product_表。在配置文件中,类Product对应表product_,id映射表里的字段id,< generator class=“native” > 意味着id的自增长方式采用数据库的本地方式。
  在创建了Product.hbm.xml文件后,还需要将该文件添加到Hibernate的核心配置文件hibernate.cfg.xml中,需要添加的内容示例:

<mapping resource="com/how2java/pojo/Product.hbm.xml" />

8、get 和 load 的区别

  Hibernate中根据Id单条查询获取对象的方式有两种,分别是get()和load()。两者的不同主要有以下四点:

  • 1、get 是立即加载,load 是延时加载。
  • 2、get 会先查一级缓存,再查二级缓存,然后查数据库;load 会先查一级缓存,如果没有找到,就创建代理对象,等需要的时候去查询二级缓存和数据库。(这里就体现 load 的延迟加载的特性。)
  • 3、get 如果没有找到会返回 null,load 如果没有找到会抛出异常。
  • 4、当我们使用 session.load()方法来加载一个对象时,此时并不会发出 sql 语句,当前得到的这个对象其实是一个代理对象,这个代理对象只保存了实体对象的 id 值,只有当我们要使用这个对象,得到其它属性时,这个时候才会发出 sql 语句,从数据库中去查询我们的对象;相对于 load 的延迟加载方式,get 就直接的多,当我们使用session.get()方法来得到一个对象时,不管我们使不使用这个对象,此时都会发出 sql 语句去从数据库中查询出来。

9、如何进行 Hibernate 的优化

9.1 数据库设计

  1>建索引
  2>减少表之间的关联
  3>简化查询字段,没用的字段不要,已经对返回结果的控制,尽量返回少量数据
  4>适当的冗余数据,不过分最求高范式

9.2 HQL优化

  1>实体查询:可以使用sql语句查询
  2>实体的更新和删除:hibernate3中直接提供更加灵活更加效率的解决方法
  3>属性查询:动态构造实例对象,对结果集进行封装
  4>分组与排序:
   Order by子句
    Group by子句与统计查询
    优化统计查询:内连接,外连接
  5>参数绑定:和jdbc一样,对hibernate的参数绑定提供了丰富的支持。

9.3 缓存

  1>数据库级缓存
    这级缓存是最高效和安全的,但不同的数据库可管理的层次并不一样,比如,在ORACLE中,可以在建表时指定将整个表置于缓存当中。
  2>SESSION缓存
    在一个HIBERNATE SESSION有效,这级缓存的可干预性不强,大多于HIBERNATE自动管理,但它提供清除缓存的方法,这在大批量增加/更新操作是有效的。比如,同时增加十万条记录,按常规方式进行,很可能会发现OutofMemeroy的异常,这时可能需要手动清除这一级缓存:Session.evict以及Session.clear。
  3>应用缓存
    在一个SESSIONFACTORY中有效,因此也是优化的重中之重,因此,各类策略也考虑的较多,在将数据放入这一级缓存之前,需要考虑一些前提条件:
    1)数据不会被第三方修改(比如,是否有另一个应用也在修改这些数据?)
    2)数据不会太大
    3)数据不会频繁更新(否则使用CACHE可能适得其反)
    4)数据会被频繁查询
    5)数据不是关键数据(如涉及钱,安全等方面的问题)。
   缓存有几种形式,可以在映射文件中配置:read-only(只读,适用于很少变更的静态数据/历史数据),nonstrict-read-write,read-write(比较普遍的形式,效率一般),transactional(JTA中,且支持的缓存产品较少)。
  4>分布式缓存
    同3的配置一样,只是缓存产品的选用不同,在目前的HIBERNATE中可供选择的不多,oscache, jboss cache,目前的大多数项目,对它们的用于集群的使用(特别是关键交易系统)都持保守态度。在集群环境中,只利用数据库级的缓存是最安全的。

9.4 结果集的使用

  1>查询方式
    list只能利用查询缓存(但在交易系统中查询缓存作用不大),无法利用二级缓存中的单个实体,但是list查出的对象会写入二级缓存,但它一般只生成较少的sql语句,很多情况就是一条。
    iterator则利用二级缓存,对于一条查询语句,它会先从数据库中找到所有符合条件的记录的ID,在通过ID去缓存找,对于缓存中没有的记录,在构造语句从数据库查出,第一次的执行会产生N+1条SQL语句。
  2>产生结果
   用list可能会溢出
   通过Iterator,配合缓存管理API,在海量数据查询中可以很好的解决内存问题。
  3>综合考虑
   一般List会填充二级缓存,却不能利用二级缓存,而Iterator可以读二级缓存,然而无法命中的话,效率很低效。一般处理方法,就是第一次查询使用list,随后使用iterator查询。

9.5 主配置

  1>查询缓存,同下面讲的缓存不太一样,它是针对HQL语句的缓存,即完全一样的语句再次执行时可以利用缓存数据。但是,查询缓存在一个交易系统(数据变更频繁,查询条件相同的机率并不大)中可能会起反作用:它会白白耗费大量的系统资源但却难以派上用场。
 &emsp2> fetch_size,同JDBC的相关参数作用类似,参数并不是越大越好,而应根据业务特征去设置
  3> batch_size同上。
  4> 生产系统中,切记要关掉SQL语句打印。

9.6 延迟加载

  1>实体延迟加载:通过使用动态代理实现
  2>集合延迟加载:通过实现自有的SET/LIST,HIBERNATE提供了这方面的支持
  3>属性延迟加载。

9.7 事务控制

事务方面对性能有影响的主要包括:事务方式的选用,事务隔离级别以及锁的选用。
  1> 事务方式选用
   如果不涉及多个事务管理器事务的话,不需要使用JTA,只有JDBC的事务控制就可以。
  2>事务隔离级别
   参见标准的SQL事务隔离级别。
  3>锁的选用
   悲观锁(一般由具体的事务管理器实现),对于长事务效率低,但安全。乐观锁(一般在应用级别实现),如在HIBERNATE中可以定义VERSION字段,显然,如果有多个应用操作数据,且这些应用不是用同一种乐观锁机制,则乐观锁会失效。因此,针对不同的数据应有不同的策略,同前面许多情况一样,很多时候我们是在效率与安全/准确性上找一个平衡点,无论如何,优化都不是一个纯技术的问题,你应该对你的应用和业务特征有足够的了解。

10、什么是 Hibernate 延迟加载

  延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。
  延迟加载的过程:通过代理(Proxy)机制来实现延迟加载。Hibernate 从数据库获取某一个对象数据时、获取某一个对象的集合属性值时,或获取某一个对象所关联的另一个对象时,由于没有使用该对象的数据(除标识符外),Hibernate 并不从数据库加载真正的数据,而只是为该对象创建一个代理对象来代表这个对象,这个对象上的所有属性都为默认值;只有在真正需要使用该对象的数据时才创建这个真正的对象,真正从数据库中加载它的数据。
  Hibernate中默认采用延迟加载的情况主要有以下几种
   1、当调用session上的load()加载一个实体时,会采用延迟加载。
   2、当session加载某个实体时,会对这个实体中的集合属性值采用延迟加载。
   3、当session加载某个实体时,会对这个实体所有单端关联的另一个实体对象采用延迟加载。

11、比较 Hibernate 三种检索策略的优缺点

  1、立即检索(lazy=false)
   优点:对应用程序完全透明,不管对象处于持久化状态,还是游离状态,应用程序都可以方便的从一个对象导航到与它关联的对象;
   缺点:1.select 语句太多;2.可能会加载应用程序不需要访问的对象白白浪费许多内存空间;
  2、延迟检索(lazy=true)
   优点:由应用程序决定需要加载哪些对象,可以避免可执行多余的 select 语句,以及避免加载应用程序不需要访问的对象。因此能提高检索性能,并且能节省内存空间;
   缺点:应用程序如果希望访问游离状态代理类实例,必须保证他在持久化状态时已经被初始化;
  3、 迫切左外连接检索( fetch=“join”)
   优点:1、对应用程序完全透明,不管对象处于持久化状态,还是游离状态,应用程序都可以方便地冲一个对象导航到与它关联的对象。2、使用了外连接,select 语句数目少;
   缺点:1、可能会加载应用程序不需要访问的对象,白白浪费许多内存空间;2、复杂的数据库表连接也会影响检索性能;

12、简述一下 hibernate 的开发流程

  总体的流程如下:
   1>导入相关jar包;
   2>编写数据库中表数据对应实体类;
   3>配置实体类对应的映射文件***.hbm.xml;
   4>配置核心配置文件hibernate.cfg.xml;
   5>写具体的hibernate使用代码。
  一个简单的hibernate代码过程书写示例:
   1>加载 hibernate 的配置文件,读取配置文件的参数(jdbc 连接参数,数据 库方言,hbm 表与对象关系映射文件)
   2>创建 SessionFactory 会话工厂(内部有连接池)
   3>打开 session 获取连接,构造 session 对象(一次会话维持一个数据连接, 也是一级缓存)
   4>开启事务
   5>进行操作
   6>第六步:提交事务
   7>关闭 session(会话)将连接释放
   8>关闭连接池

13、Hibernate工作原理及为什么要用

13.1 原理

  1>读取并解析配置文件
  2>读取并解析映射信息,创建SessionFactory
  3>打开Sesssion
  4>创建事务Transation
  5>持久化操作
  6>提交事务
  7>关闭Session
  8>关闭SesstionFactory

13.2 为什么要用

  1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
  2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作
  3. hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。
  4. hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。

14、Hibernate是如何延迟加载(懒加载)

  首先介绍一下延迟加载的几种情况:

  • 当调用Session上的load()方法加载实体时,就会采用延迟加载;
  • 当Session加载某个实体时,会对这个实体中的集合属性值采用延迟加载;
  • 当Session加载某个实体时,会对这个实体所单端关联(one-to-one,many-to-one)的另一个实体对象采用延迟加载。

  延迟加载的过程:Hibernate从数据库获取某一个对象数据、获取某一个对象的集合属性时,获取某一个对象所关联的另一个对象时,由于没有使用该对象的数据,hibernate并不从数据库加载真正的数据。而是为该对象创建一个代理对象来代表这个对象,这个对象上的所有属性都为默认值,只有在真正的需要该对象的数据时才创建这个真实的对象,真正的从数据库中加载数据。

  • 1、要实现某个实体的延迟加载,用load方法即可,示例:
        Product p = (Product)s.load(Product.class, 1);System.out.println("log1");System.out.println(p.getName());System.out.println("log2");
  • 2、要实现关系的延迟加载,可以在 实体类.hbm.xml 的class类标签或者是set集合的标签中设置lazy=false,表示立即加载,而true表示懒加载。示例:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC"-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping package="com.how2java.pojo"><class name="Category" table="category_"><id name="id" column="id"><generator class="native"></generator></id><property name="name" /><set name="products" lazy="true"><key column="cid" not-null="false" /><one-to-many class="Product" /></set></class></hibernate-mapping>

15、Hibernate中怎样实现类之间的关系

  类与类之间的关系主要体现在表与表之间的关系进行操作,它们都是对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、one-to-many、many-to-many,来实现类之间的关系。

16、Hibernate里面的sorted collection 和ordered collection有什么区别

  sorted collection是在内存中通过Java的Comparator进行排序的;ordered collection是在数据库中通过order by进行排序的。对于比较大的数据集,为了避免在内存中对它们进行排序而出现 Java中的OutOfMemoryError,最好使用ordered collection。

17、在数据库中条件查询速度很慢的时候,如何优化

  1、建索引
  2、减少表之间的关联
  3、优化sql,尽量让sql很快定位数据,不要让sql做全表查询,应该走索引,把数据量大的表排在前面
  4、简化查询字段,没用的字段不要,已经对返回结果的控制,尽量返回少量数据

18、SessionFactory是线程安全么

  SessionFactory就是一个用于创建Hibernate的Session对象的工厂。SessionFactory通常是在应用启动时创建好的,应用程序中的代码用它来获得Session对象。作为一个单个的数据存储,它也是 线程安全的,所以多个线程可同时使用同一个SessionFactory。Java JEE应用一般只有一个SessionFactory,服务于客户请求的各线程都通过这个工厂来获得Hibernate的Session实例,这也是为什么SessionFactory接口的实现必须是线程安全的原因。还有,SessionFactory的内部状态包含着同对象关系影射有关的所有元数据,它是 不可变的,一旦创建好后就不能对其进行修改了。

19、persist和save的区别

  • 1、persist不保证立即执行,可能要等到flush;save会立即执行Sql的insert语句;
  • 2、persist不更新缓存;save更新。
  • 3、使用 save保存持久化对象时,该方法返回该持久化对象的标识属性值(即对应记录的主键值);使用 persist来保存持久化对象时,该方法没有任何返回值。
  • 4、在事务里执行到save,会向数据库插一条数据,如果事务里异常,会回滚,删除数据库中插入的数据;在事务里执行到persist,不会向数据库插数据,事务commit了才会插入数据。

20、常见的主键生成策略有哪些

  Hibernate提供相应的API能自动生成数据库表,说到表,一定会设计到的一个概念就是主键,主键是由程序自动生成的,不应该由用户自己输入。Hibernat提供了主键生成策略,下面主要讲一下常用的几种,配置形式如下:

<id name="id"><generator class="主键生成策略名称" />      
</id>
  • 1、uuid
      Universally Unique Identifier的缩写,通用唯一识别码,UUID是由一组32位数的16进制数字所构成是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的; Hibernate在保存对象时,生成一个uuid字符串作为主键,保证了唯一性,但其无任何业务逻辑意义; 适用与所有的数据库,但是生成的主键占用的存储空间较大
  • 2、identity
       identity是由底层数据库自己生成的标识符,但这个主键必须设置为自增长,由数据库生成,使用identity的前提条件是底层数据库支持自动增长字段类型,如SQL Server、MySQL等,Oracle这类没有自增字段的则不支持。如果使用MySQL数据库,则主键字段必须设置成auto_increment(此句上网查得的),但是自己试验得出,Hibernate在创建MySql中的表时会自动将该字段设置成auto_increment,该字段必须设置为是能自增的数据类型,否则会报错。
  • 3、hilo
      hilo(高低位方式high low)是hibernate中最常用的一种生成方式,需要一张额外的表保存hi的值,该表中只有一条数据,即记录hi的下一个值,适用于所有数据库,但生成的标志只能在一个数据库中保证唯一,配置如下:
<id name="id" column="id"><generator class="hilo"><!--指定保存hi值的表名,MySQL默认表名为hibernate_unique_key--><param name="table">hibernate_hilo</param><!--指定保存hi值的列名--><param name="column">next_hi</param><!--指定低位的最大值--><param name="max_lo">100</param></generator>
</id>

  如果使用默认的表名和列名,可以省略table和column:

<id name="id" column="id"><generator class="hilo"><param name="max_lo">100</param></generator>
</id>

  hilo生成器生成主键的过程(以hibernate_unique_key表,next_hi列为例):

  1. 获得hi值:读取并记录数据库的hibernate_unique_key表中next_hi字段的值,数据库中此字段值加1保存。
  2. 获得lo值:从0到max_lo循环取值,差值为1,当值为max_lo值时,重新获取hi值,然后lo值继续从0到max_lo循环。
  3. 根据公式 hi * (max_lo + 1) + lo计算生成主键值。
      注意:当hi值是0的时候,那么第一个值不是0*(max_lo+1)+0=0,而是lo跳过0从1开始,然后再按上面的规律生成主键,即1,101,202。
      那max_lo配置多大合适呢?这要根据具体情况而定,如果系统一般不重启,而且需要用此表建立大量的主键,可以吧max_lo配置大一点,这样可以减少读取数据表的次数,提高效率;反之,如果服务器经常重启,可以吧max_lo配置小一点,可以避免每次重启主键之间的间隔太大,造成主键值主键不连贯。
  • 4、sequence
      只适用于支持sequence机制生成主键的数据库,主键值由数据库生成,如MySql就不支持,Oracle就支持
  • 5、native
      native由hibernate根据使用的数据库自行判断采用identity、hilo、sequence其中一种作为主键生成方式,灵活性很强,这样以来如果一个项目中使用多个数据库时,就可以使用这种方式
  • 6、foreign
    使用另外一个相关联的对象的主键作为该对象主键。主要用于一对一关系中。

  对数据库的依赖性:
    UUID,increment、Hilo、assigned:对数据库无依赖
    identity:依赖Mysql或sql server,主键值不由hibernate维护
    sequence:适合于oracle等支持序列的dbms,主键值不由hibernate维护,由序列产生
    native:根据底层数据库的具体特性选择适合的主键生成策略,如果是mysql或sqlserver,选择identity,如果是oracle,选择sequence
  主键生成策略的选择:一般来说推荐UUID,因为生成主键唯一,且对数据库无依赖,可移植性强。

21、简述hibernate中getCurrentSession和openSession区别

  1、getCurrentSession会绑定当前线程,而openSession不会,因为我们把hibernate交给我们的spring来管理之后,我们是有事务配置,这个有事务的线程就会绑定当前的工厂里面的每一个session,而openSession是创建一个新session。
  2、getCurrentSession事务是由spring来控制的,而openSession需要我们手动开启和手动提交事务。
  3、getCurrentSession是不需要我们手动关闭的,因为工厂会自己管理,而openSession需要我们手动关闭。
  4、而getCurrentSession需要我们手动设置绑定事务的机制,有三种设置方式,jdbc本地的Thread、JTA、第三种是spring提供的事务管理机制org.springframework.orm.hibernate4.SpringSessionContext,而且srping默认使用该种事务管理机制。

22、为什么在Hibernate的实体类中要提供一个无参数的构造器这一点非常重要

  每个Hibernate实体类必须包含一个 无参数的构造器, 这是因为Hibernate框架要使用Reflection API,通过调用Class.newInstance()来创建这些实体类的实例。如果在实体类中找不到无参数的构造器,这个方法就会抛出一个InstantiationException异常。

23、谈谈Hibernate中inverse的作用

  inverse属性默认是false,就是说关系的两端都来维护关系。 比如Student和Teacher是多对多关系,用一个中间表TeacherStudent维护。Gp)i 如果Student这边inverse=”true”, 那么关系由另一端Teacher维护,就是说当插入Student时,不会操作TeacherStudent表(中间表)。只有Teacher插入或删除时才会触发对中间表的操作。所以两边都inverse=”true”是不对的,会导致任何操作都不触发对中间表的影响;当两边都inverse=”false” 或默认时,会导致在中间表中插入两次关系。

24、Hibernate如何实现数据表映射的继承关系

  1、两个表,子类重复父类的属性。
   2、一个表,子类父类共用一个表
  3、两个表,子类引用父类的主键,享用公共的字段或属性。

25、在hibernate中进行多表查询,每个表中各取几个字段,也就是说查询出来的结果集并没有一个实体类与之对应,如何解决这个问题

  解决方案一,按照Object[ ]数据取出数据,然后自己组bean。
  解决方案二,对每个表的bean写构造函数,比如表一要查出field1,field2两个字段,那么有一个构造函数就是Bean(type1 filed1,type2 field2) ,然后在hql里面就可以直接生成这个bean了。

  本文内容均来自网上,只为方便学习使用,原文链接:
  Hibernate最全面试题
  JAVA三大框架面试题之hibernate(含答案)
  hibernate中的对象三种状态以及三种对象之间的转换

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 装备作战需求论证质量效能评估系统软件设计解决方案

    装备作战需求论证质量效能评估系统软件设计解决方案 装备作战效能评估系统是为解决武器装备效能评估问题新研发的一款软件&#xff0c;武器效能评估系统用于武器装备论证、研制、试验、使用等不同阶段的效能评估&#xff0c;武器效能评估系统为作战体系、装备体系评价和优化提…...

    2024/4/24 21:46:20
  2. React 事件处理笔记

    需要注意的两点&#xff1a;1.需要在事件绑定的函数中获取事件对象 2.事件绑定函数中的this指向问题 疑惑点&#xff1a;什么是public class fields语法 一、事件对象作为参数传递 事件绑定的函数没有传参 function ActionLink() {function handleClick(e) { // 默认…...

    2024/4/24 21:46:18
  3. 如何快速搭建知识付费平台

    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201125101621524.png?x-oss-processimage/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NTWTk1NDkxNzkxOQ,size_16,color_FFFFFF,t_70#pic_center)现如今在互联网知识付费的高速催…...

    2024/4/24 21:38:20
  4. Android -- 让我一个外行来告诉你Android的多Activity切换中保持Socket长连接的一个实现方法

    内容预览零、感 叹 啊一、说 明二、实现功能与效果图2.1、实现功能描述2.2、效果图显示三、主要实现功能的代码3.1、Project 的文件列表3.2、ApplicationUtil.java类3.3、MainActivity.java类与activity_main.xml3.4、FirstActivity.java类与activity_first.xml3.5、AndroidMan…...

    2024/4/24 21:38:26
  5. 【疑难排查】RTMP推流协议视频智能分析平台EasyDSS直播点播系统开启录像后无法录制

    TSINGSEE青犀视频云边端架构视频智能分析平台EasyDSS提供直播版和点播版的授权&#xff0c;近期研发人员测试EasyDSS最新版本时&#xff0c;开启了录像计划之后&#xff0c;直播视频可以正常播放&#xff0c;但是查看录像的时候没有录像。 我们检查了录像的存储&#xff0c;发现…...

    2024/4/24 21:38:21
  6. 正则表达式学习

    1-8位数字截取匹配和整体匹配 Regex re new Regex("^[0-9]{1,8}"); //截取匹配 Regex regex new Regex("^[0-9]{1,8}$"); //整体匹配//匹配字符串:m1.large(vcpu 2,ram 4G)|c95f5529-47e8-46d4-85da-319eb9905a9b. //目标字符串:vcpu&#xff1a; “2”…...

    2024/4/24 21:38:16
  7. Armadillo(六):rand,randn,randnu的对应关系

    matlab的rand:产生【0,1】的均匀分布伪随机数 Armadillo的randu&#xff1a;在[0,1]间隔中使用均匀分布 matlab的randn:生成标准正态分布的伪随机数&#xff08;均值为0&#xff0c;方差为1&#xff09; Armadillo的randn:使用正态/高斯分布&#xff0c;均值和单位方差为零...

    2024/4/25 22:35:51
  8. 计算机网络 数据传输(二)

    1、数据传输类型 电路交换&#xff0c;报文交换&#xff0c;分组交换 互联网采用的是分组交换 电路传输 代表&#xff1a;电话网 电路交换的三个阶段 1、建立连接&#xff08;电路建立&#xff09; 2、通信 3、释放连接 特点&#xff1a;独占资源 中继线是可以共用的 …...

    2024/4/24 21:38:14
  9. spring boot 1.5.3 源代码片段 - @Validated - EnableAutoConfiguration

    机制&#xff1a;依赖 BeanPostProcessor advisor // org.springframework.boot.autoconfigure.EnableAutoConfiguration\ org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration /*注册 org.springframework.validation.beanvalidation.MethodVal…...

    2024/4/24 21:38:16
  10. 用Session和Cookie区分不同用户

    用Session和Cookie区分不同用户...

    2024/4/24 21:38:18
  11. 判断数组、对象为空

    1、判断数组为空 if(arr.length0){console.log(空)// 数组arr为空}2、判断对象为空 var obj {};if(JSON.stringify(obj) "{}"){console.log(空)}或用es6间接证明 利用对象在中所有的键&#xff0c;组成数组并判断数组是否为空&#xff0c;如&#xff1a; const ob…...

    2024/4/24 21:46:20
  12. JAVA(基础) 面向对象一

    JAVA(基础) 面向对象一 前面我们学习的是面向过程&#xff0c;现在我们来学习面向对象。面向过程就好比一件事自己一步步去完成&#xff0c;而面向对象则是找人去完成这件事&#xff0c;具体这件事是怎样做的&#xff0c;我们不在乎&#xff0c;我们只在乎结果。面向对象依托于…...

    2024/4/24 21:46:16
  13. 中国风冬日节日必备梅花PNG免扣素材

    随着中国国际地位日益提高&#xff0c;新生代在国家日益强健的环境下成长起来&#xff0c;整体国民素质大大提 高&#xff0c;民族自信和民族自豪感根深于大家的心里。冬日传统中国节日接踵而来&#xff0c;特具中国特色的 水墨风梅花PNG素材&#xff0c;设计师请提前收藏好&…...

    2024/4/24 21:46:16
  14. 数据安全不仅仅局限于技术

    数字商业环境带来了巨大的机遇&#xff0c;同时也带来了针对重要商业数据资产的数据泄露风险。这些数据是决策、持续经营、市场竞争力和法规遵从性的重要组成部分。 由于业务数据中包含如此多的价值&#xff0c;针对企业“皇冠上的宝石”的威胁和攻击变得更加复杂和有针对性。…...

    2024/4/24 21:46:15
  15. Docker --restart参数

    Docker restart参数用于指定自动重启docker容器策略&#xff0c;包含3个选项&#xff1a;no&#xff0c;on-failure[:times]&#xff0c;always no 默认值&#xff0c;表示容器退出时&#xff0c;docker不自动重启容器docker run --restartno [容器名]on-failure 若容器的退出状…...

    2024/4/24 21:46:16
  16. iOS 2020刘海适配,底部安全区域高度

    废话不多说直接上代码&#xff1a; 方法一&#xff1a; //判断是否为iPhone X #define IPHONE_X \ ({BOOL isPhoneX NO;\ if (available(iOS 11.0, *)) {\ isPhoneX [[UIApplication sharedApplication] delegate].window.safeAreaInsets.bottom > 0.0;\ }\ (isPhoneX);}…...

    2024/4/24 21:46:12
  17. wkhtmltopdf使用注意

    1&#xff0c;wkhtmltopdf生成封面 一定要先把header和footer放在前面 要不然会没页眉和页脚 2&#xff0c;使用url有&这些要加上“”&#xff1b; 3&#xff0c;linux版的可执行版本只有0.12.3版本&#xff0c;后面都是rpm&#xff1b; 4&#xff0c;字体要拷贝到linux…...

    2024/4/24 21:46:11
  18. 各国语言简写代码

    各国语言简写代码 _荣耀之路_ 2018-07-31 00:51:04 6806 收藏 4 分类专栏&#xff1a; 其他 文章标签&#xff1a; 语言简写代码 最后发布:2018-07-31 00:51:04首次发布:2018-07-31 00:51:04版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循CC 4.0 BY-SA 版权协议&a…...

    2024/4/24 21:46:13
  19. vim 复制/剪切/粘贴/撤销操作 from csdner Qidi_Huang

    【背景知识】 vim 有 12 个粘贴板&#xff0c;分别是 0、1、2、…、9、a、“、&#xff0b;&#xff1b;用 :reg 命令可以查看各个粘贴板里的内容。在 vim 中简单用 y 命令只是复制到 "&#xff08;双引号&#xff09;粘贴板里&#xff0c;同样用 p 命令粘贴的也是这个粘…...

    2024/4/24 21:46:09
  20. 使用jqdata和hikyuu平台进行C /python混合策略编写的方法

    &#xff08;转自&#xff1a;https://www.joinquant.com/view/community/detail/a536564c8c751349d5ad3529bad8e9e1&#xff09; 很多时候为了运行复杂的策略用python速度会很慢&#xff0c;而核心部分用C 编写可以大幅提升策略的运行速度。另外通达信、金字塔等主流证券软件…...

    2024/4/24 21:46:09

最新文章

  1. Redis深度解析与面试必备问答(必知必会20题全)

    一、Redis简介 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的使用ANSI C语言编写的、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。它通常被称为数据结构服务器&#xff0c;因为值&#xff08;value&…...

    2024/4/26 20:53:22
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 如何训练自己的ChatGPT?需要多少训练数据?

    近年&#xff0c;聊天机器人已经是很常见的AI技术。小度、siri、以及越来越广泛的机器人客服&#xff0c;都是聊天机器人的重要适用领域。然而今年&#xff0c;ChatGPT的面世让这一切都进行到一个全新的高度&#xff0c;也掀起了大语言模型&#xff08;LLM&#xff09;的热潮。…...

    2024/4/21 20:36:50
  4. 北航2023年考研机试题

    【问题描述】一共6个手机基站&#xff0c;具有记录手机连接基站的能力&#xff0c;6个手机基站分别为ABCDEF&#xff0c;他们具有自己的覆盖范围且任何两个基站的覆盖范围不想交&#xff0c;基站保存的手机登陆日志包括手机号&#xff08;11位&#xff0c;用字符串保存&#xf…...

    2024/4/23 6:26:10
  5. linux系统编程 线程 p1

    线程 1.线程的概念2.线程的创建/终止/取消&#xff0c;栈的清理2.1线程创建2.2线程终止2.3 栈的清理 1.线程的概念 线程就是一个正在运行的函数。 posix线程是一套标准&#xff0c;而不是实现。 openmp线程。 线程标识&#xff1a;pthread_t &#xff08;linux环境下是整形数&…...

    2024/4/25 1:46:17
  6. 416. 分割等和子集问题(动态规划)

    题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义&#xff1a;dp[i][j]表示当背包容量为j&#xff0c;用前i个物品是否正好可以将背包填满&#xff…...

    2024/4/26 1:36:40
  7. 【Java】ExcelWriter自适应宽度工具类(支持中文)

    工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...

    2024/4/25 21:14:51
  8. Spring cloud负载均衡@LoadBalanced LoadBalancerClient

    LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon&#xff0c;直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件&#xff0c;我们讨论Spring负载均衡以Spring Cloud2020之后版本为主&#xff0c;学习Spring Cloud LoadBalance&#xff0c;暂不讨论Ribbon…...

    2024/4/26 8:22:40
  9. TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案

    一、背景需求分析 在工业产业园、化工园或生产制造园区中&#xff0c;周界防范意义重大&#xff0c;对园区的安全起到重要的作用。常规的安防方式是采用人员巡查&#xff0c;人力投入成本大而且效率低。周界一旦被破坏或入侵&#xff0c;会影响园区人员和资产安全&#xff0c;…...

    2024/4/26 11:10:01
  10. VB.net WebBrowser网页元素抓取分析方法

    在用WebBrowser编程实现网页操作自动化时&#xff0c;常要分析网页Html&#xff0c;例如网页在加载数据时&#xff0c;常会显示“系统处理中&#xff0c;请稍候..”&#xff0c;我们需要在数据加载完成后才能继续下一步操作&#xff0c;如何抓取这个信息的网页html元素变化&…...

    2024/4/25 16:50:01
  11. 【Objective-C】Objective-C汇总

    方法定义 参考&#xff1a;https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...

    2024/4/25 13:02:58
  12. 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】

    &#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格…...

    2024/4/26 0:25:04
  13. 【ES6.0】- 扩展运算符(...)

    【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数&#xff0…...

    2024/4/26 6:06:14
  14. 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?

    文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕&#xff0c;各大品牌纷纷晒出优异的成绩单&#xff0c;摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称&#xff0c;在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁&#xff0c;多个平台数据都表现出极度异常…...

    2024/4/26 17:59:13
  15. Go语言常用命令详解(二)

    文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令&#xff0c;这些命令可以帮助您在Go开发中进行编译、测试、运行和…...

    2024/4/25 17:43:00
  16. 用欧拉路径判断图同构推出reverse合法性:1116T4

    http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b&#xff0c;我们在 a i a_i ai​ 和 a i 1 a_{i1} ai1​ 之间连边&#xff0c; b b b 同理&#xff0c;则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然&#xff0…...

    2024/4/26 17:00:23
  17. 【NGINX--1】基础知识

    1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息&#xff0c;并安装一些有助于配置官方 NGINX 软件包仓库的软件包&#xff1a; apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...

    2024/4/25 17:42:40
  18. Hive默认分割符、存储格式与数据压缩

    目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限&#xff08;ROW FORMAT&#xff09;配置标准HQL为&#xff1a; ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...

    2024/4/26 9:43:47
  19. 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法

    文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中&#xff0c;传感器和控制器产生大量周…...

    2024/4/26 9:43:47
  20. --max-old-space-size=8192报错

    vue项目运行时&#xff0c;如果经常运行慢&#xff0c;崩溃停止服务&#xff0c;报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中&#xff0c;通过JavaScript使用内存时只能使用部分内存&#xff08;64位系统&…...

    2024/4/25 13:40:45
  21. 基于深度学习的恶意软件检测

    恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞&#xff0c;例如可以被劫持的合法软件&#xff08;例如浏览器或 Web 应用程序插件&#xff09;中的错误。 恶意软件渗透可能会造成灾难性的后果&#xff0c;包括数据被盗、勒索或网…...

    2024/4/25 13:01:30
  22. JS原型对象prototype

    让我简单的为大家介绍一下原型对象prototype吧&#xff01; 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定&#xff0c;每一个构造函数都有一个 prototype 属性&#xff0c;指向另一个对象&#xff0c;所以我们也称为原型对象…...

    2024/4/25 15:31:26
  23. C++中只能有一个实例的单例类

    C中只能有一个实例的单例类 前面讨论的 President 类很不错&#xff0c;但存在一个缺陷&#xff1a;无法禁止通过实例化多个对象来创建多名总统&#xff1a; President One, Two, Three; 由于复制构造函数是私有的&#xff0c;其中每个对象都是不可复制的&#xff0c;但您的目…...

    2024/4/25 17:31:15
  24. python django 小程序图书借阅源码

    开发工具&#xff1a; PyCharm&#xff0c;mysql5.7&#xff0c;微信开发者工具 技术说明&#xff1a; python django html 小程序 功能介绍&#xff1a; 用户端&#xff1a; 登录注册&#xff08;含授权登录&#xff09; 首页显示搜索图书&#xff0c;轮播图&#xff0…...

    2024/4/25 13:22:53
  25. 电子学会C/C++编程等级考试2022年03月(一级)真题解析

    C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...

    2024/4/26 9:43:45
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  27. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  29. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  30. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  31. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  32. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  33. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  36. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  37. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  38. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  39. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  40. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  41. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  42. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  43. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  44. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  45. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57