持久化/Session和SessionFactory线程非安全和安全/Hibernate的优点

javabean=pojojava

持久化:持久化是程序数据在瞬时状态和持久状态间转换的过程数据库

持久化之后就是pc
PO=POJO+xml 配置 他是普通的java对象缓存

直接用它来传递。传递过程当中就是DTO(Data Transefer Object)
直接用来对应表示层就是VO安全

 

SessionFactory重量级的,一个线程中只能有一个,而且是线程安全的。session每一个线程一份,线程非安全!
SessionFactory:线程安全,保存了当前数据库配置信息和全部映射关系以及预约义的SQL语句。在SessionFactory中内会了链接池。
1.OpenSesion() --从链接池中随意获取一个链接。
2.getCurrentSession() --将Session和Threadlocal绑定,确保再一次请求中,只有一个Session对象
一般一个应用只会初始化一个SessionFactory(表明一个链接池)session

 

Hibernate的优点

l 优秀的Java 持久化层解决方案  (DAO)多线程

l 主流的对象—关系映射工具产品并发

l 简化了JDBC 繁琐的编码框架

l 将数据库的链接信息都存放在配置文件svn

l 本身的ORM框架工具

必定要手动实现Hibernate(模拟Hibernate实现)


Hibernate中的是session,不是http协议中的session。固然他也不是connection,初学者能够当作是connection

Hibernate框架位于应用程序和数据库之间,将数据库底层操做彻底封装。应用po对象进行Hibernate操做,完成对数据库的操做。经常使用值是key 
和val

Hibernate核心配置
Configuration 配置文件加载工具
SessionFactory 链接池工厂
session 会话(至关于 Connection)
Transaction 事务(最复杂)
3.Session:表明链接,线程不安全。
对比ThreadLocal和synchronized同步机制
相同点:
 一、ThreadLocal和线程同步机制都能解决多线程中相同变量的访问冲突问题。
不一样点:
一、适用的状况不一样
 在同步机制中,使用同步保证同一时间只有一个线程访问,不能同时访问共享资源,不然就是出现错误。ThreadLocal则隔离了相关的资 
源,并在同一个线程中能够共享这个资源。彼此独立,修改不会影响到对方。
二、最终实现的效果不一样
对于多线程资源共享问题,同步机制采用了“以时间换空间”的方式,而ThreadLocal采用了“以空间换时间”的方式。前者仅提供一份 
变量,让不一样的线程排队访问,然后者为每个线程都提供了一份变量,所以能够同时访问而互不影响。
4.Transaction 表明事务
commit(); 提交事务,rollback(); 回滚事务
若是没有开启事务,那么每一个Session的操做,都至关于一个独立的事务

数据库提供事务
解析:四个阶段ACID
隔离性(两个事务)
多并发问题
脏读 不可重复 幻想读 丢失更新问题 解决多线程并发:解决方式

事务隔离级别
Read-uncommited 读未提交

丢失更新问题:
乐观锁:svn 数据库保存版本号,程序更改版本号
悲观锁:
脏检查:当事务提交时,Hiberante会对Session中持久状态的对象进行检测,判断对象的数据是否发生了改变
依据:
为何要进行脏检查?
解析:若是对象发生了改变,就须要将改变动新到数据库中,以确保内存中的对象与数据库中的数据保持一致。
如何脏检查?
  解析:当一个Dept对象被加入到Session缓存(有人又称为 一级缓存 后者是内部缓存)中时,Session会为Dept对象的值类型的属性复制一 
份快照。当Session刷新缓存时,会先进行脏检查,即比较Dept对象的当前属性与它的快照,来判断Dept对象的属性是否发生了变化。若是发生了 
变化,Session会根据脏对象的最新属性值来执行相关的SQL语句,将变化更新到数据库中。
Session具备一个缓存,能够管理和跟踪全部持久化对象,对象和数据库中的相关记录对应。
Session会在如下时间点刷新缓存
1)事务的commit()
2) session.flush()
S2 C# IO stream.flush(); 
一级缓存

更新数据的方法 update()方法saveOrUpdate()方法merge()方法

相关文章
相关标签/搜索