• 持久化/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()方法

  • 相关阅读:
    软件产品案例分析 ——华为软件开发云
    软件工程实践2017第一次作业
    软件工程实践2017结对第二次作业
    SDN第一次作业
    路由器工作原理
    Spring框架之springweb web源码完全解析
    Spring框架之springweb http源码完全解析
    Spring框架之jms源码完全解析
    Spring框架之AOP源码完全解析
    比特币里的计算机知识
  • 原文地址:https://www.cnblogs.com/qingzhi/p/5817866.html
Copyright © 2020-2023  润新知