hibernate

本文详细介绍了J2EE框架及其组件技术,并深入探讨了Hibernate框架的特点、应用场景、优化策略等核心内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



企业级应用需要解决:并发、交互、事务、集群、安全、分布式、WEB的一系列问题


EJB(企业级JavaBean)服务主要提供生命周期管理、代码产生、持续性管理、安全、事务管理、锁和并发行管理等服务


J2EE是一套设计、开发、汇编和部署企业应用程序的规范
 提供了企业级应用程序的开发平台,提供了多层结构、分布式、基于组件、松耦合、安全可靠、独立于
 平台且反应迅速的应用程序环境


J2EE包含的组件技术:
 JSP:J2EE的web层核心技术
 Servlet:J2EE的web层核心技术
 JDBC:数据库访问技术
 XML:跨平台的可扩展性标记语言
 EJB:J2EE的业务层核心技术
 JNDI:Java命名和目录接口
 JMS:Java消息服务
 JTA和JTS:Java事务管理
 JavaMail:邮件收发
 RMI:远程方法调用
 IDL:接口定义语言,将Java和CORBA集成的一种技术

重量级框架:启动、测试、运行都离不开容器单独运行,依赖性强
轻量级框架:SUN提出容器提供服务,轻量级框架提供同样的服务,用来支持POJO,通过代理方法实现服务的附加,
 用轻量级框架,持久层和业务层可以单独测试


hibernate
什么是O/R Mapping?
 对象-关系映射是一门非常实用的工程技术,它实现了Java应用中的对象到关系数据库中的表的自动的(
 和透明的)持久化,使用元数据(meta data)描述对象和数据库的映射
 
 优点:提高生产率
  可维护性
  更好性能


hibernate特点:
 hibernate是一种开放源代码的对象/关系映射持久层框架
 事务处理,生命周期管理不依赖于J2EE容器
 解决数据库的方言问题
 hibernate只需要操作对象就可以完成数据库的增、删、改、查操作,使用hibernate更面向对象
 轻量级,无侵入性,移植性好


ssh:
struts:撑杆
hibernate:冬眠
spring:春天


hibernate不适用范围:
 批量对对象进行操作
 使用数据库特定映射
 表单关系很复杂时,会造成性能问题

主键生成策略:
 increment(自动增长,其主键由hibernate控制,数据库中相应的字段没有设置自动增长,不能用于集群)
 identity(自动增长,对DBI,Mysql,sql,server数据库中相应的字段设置自动增长)
 sequence(对oracle数据库中相应的字段设置自动增长)
 UUID:采用UUID算法生成字符串唯一标识,UUID生成策略相对来说速度较快,不需要使用数据库相关的维护表的
  操作,但查找相对较慢。
 native:(根据数据库底层的描述,决定采用identity,sequence中的一个)
 assigned:手动分配主键,当generator没有设置时,采用这种方式
 select:使用触发器分配主键
 foreign:使用另外一个相关联的对象的标识符,通常和<one-to-one>联合起来使用oracle序列添加主键生成策略 
  oracle序列添加主键生成策略
  <id name="custld">
   <generator class="sequence">
    S_CUST_ID为序列名称
    <praram name="sequence">S_CUST_ID</param>
   </generator>
  </id>


对象状态
 Transient(瞬时状态)
 当生成PO对象时产生,数据库中没有相应的记录,没有session对其进行管理
 persistent(持久状态)
 当session对象调用saveorupdate()时,数据库中有与之对应的记录,有session对象对之进行管理,
 当PO对象的值发生变化时,session对象让数据库记录与之同步。
 Detached(游离状态)
 当session事务提交时,数据库中有与之对应的记录,从session一级缓存中清除,session对其不再进行管理。


一对一有两种方式:
主键关联:从表的主键同时又是主表的外键。从表没有单独的外键列。
外键关联:从表中存在外键列,关联主表的主键列。但外键列是不重复。

当当前对象执行某操作的情况下,其关联的对象也执行cascade设置的同样操作


cascade和inverse的区别:
cascade表示级联操作,当主表记录做操作时,从表记录做相应的操作,维护的是记录。
inverse表示控制反转。当该属性设置为真时,表示由关联对象维护外键关系,当前对象不做外键维护,维护的是外键。


缓存就是数据库数据在内存中的临时容器

位于数据库与数据库访问层之间

ORM在查询数据时首先会根据自身的缓存管理策略,在缓存中查找相关数据,如发现所需的数据,则直接将此数据
作为结果加以利用

避免了数据库调用性能的开销

相对内存操作而言,数据库调用是一个代价高昂的过程


缓存分类
一级缓存:即在当前事务范围内的数据缓存
 就Hibernate来讲,(一级缓存)事务级缓存是基于session的生命周期实现的,session一旦关闭,
 一级缓存就清除,一级缓存为hibernate自带的缓存,是必需的
应用级(二级)缓存:即在某个应用中或应用中某个独立数据库访问子集中的共享缓存,此缓存可由多个事务共享,
 在hibernate中,应用级缓存由sessionFactory实现
分布式缓存:即在多个应用实例,多个JVM间共享的缓存策略


hibernate延迟加载类型
实体对象的延迟加载(load())
集合的延迟加载(一对多和多对多时,关联集合)
属性的延迟加载(colb大数据类型时)


colb:存放大文本的类型
bolb:存放二进制数据的类型(效率低)


锁机制
多个用户可能同时读取或者更新一个数据
需要一些机制来保证这些数据在某个操作过程中不会被外界修改,这样的机制,也就是所谓的“锁”,即给我们
选定的目标数据上锁,使其无法被其他程序修改

hibernate支持两种锁机制:
“悲观锁”(Pessimistic Locking):实现依赖于数据库机制,在整个过程中,将数据锁定,其他任何用户不能
    对其读取和修改,一般适合于短事务,并发性不好

“乐观锁”(Optimistic Locking):依靠数据版本记录机制实现
 为数据增加一个版本标识,增加一个version字段
 读取数据时,将版本号一同读出
 更新时,版本号加一
 将提交数据的版本与数据库表对应记录的当前版本信息进行比对
 如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则以为是过期数据


数据库隔离级别:
Read UnCommited没有提交,就能读到。比如发出insert,在没有提交时就能更新数据库
 存在脏读,一个事务读取一行,另一个事务已经将该记录更新但没有提交
 如果一个事务已经写数据,另一个事务则不允许同时进行写操作
Read Commited提交读。提交之后,才可以更新数据库
 不存在脏读。存在不接重复读。
 如果一个用户读出是张三,另一个用户将该用户名改为李四,那么第一个用户再度则是李四
 存在虚读,用户查询数据时,两次查询的内容不一致未提交的写事务将会禁止其他事务访问该行
Repeatable Read可重复读
 读取的事务将禁止写事务,写事务则禁止任何其他事务不存在不可重复读,但不能避免虚读
Serializable可序列化读
 事务只能一个接一个执行,不能并发执行



用连接池的原因
频繁的数据库连接操作势必占用很多的系统资源,响应速度必定下降。程序出现异常而未能关闭,将会导致数据库
系统中的内存泄漏,最终将不得不重启数据库。系统资源被毫无顾忌的分配出去,如连接过多,也可能导致内存
泄漏,服务器崩溃

连接池工作原理:
为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从
“缓冲池”中取出一个,使用完毕之后再放回去。通过设定连接池最大连接数来防止系统无休止的数据库连接。
更为重要的是可以通过连接池的管理机制监视数据库的连接的数量、使用情况,为系统开发、测试及性能调整提供依据。

连接池的工作流程:
持久层向连接池申请一个连接。连接池返回一个空闲连接。如果没有空闲连接,那么就检查连接池中的连接数量
是否到达最大连接数。如果没有到达最大连接数,则建立新的连接对象放入连接池中。如果到达最大连接数,那么
用户就需要等待。这时可以设置最大等待时间来控制用户的 等待状态。等待时间内有别的连接对象被释放,那么
就分配给等待对象。如果超时,那么返回null。


hibernate常见的优化策略
 用高版本的hibernate
 制定合理的缓存策略
 采用合理的session管理机制
 尽量使用延迟加载
 如有可能,采用UUID作为主键生成策略
 如有可能,选用乐观锁代替悲观锁
 在开发中,显示hibernate执行的SQL语句,从而指定更好的实现策略
 复杂查询和统计查询可以使用SQL语句完成,甚至可以考虑使用存储过程完成


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值