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

javabean=pojo

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

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

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

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

Hibernate的优势

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

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

l 简化了JDBC 繁琐的编码

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

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同步机制
相同点:
 1、ThreadLocal和线程同步机制都能解决多线程中相同变量的访问冲突问题。
不同点:
1、适用的情况不同
 在同步机制中,使用同步保证同一时间只有一个线程访问,不能同时访问共享资源,否则就是出现错误。ThreadLocal则隔离了相关的资 
源,并在同一个线程中可以共享这个资源。彼此独立,修改不会影响到对方。
2、最终实现的效果不同
对于多线程资源共享问题,同步机制采用了“以时间换空间”的方式,而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()方法

原文地址:https://www.cnblogs.com/qingzhi/p/5817866.html