zoukankan      html  css  js  c++  java
  • hibernate框架学习之Session管理

    Session对象的生命周期

    lHibernate中数据库连接最终包装成Session对象,使用Session对象可以对数据库进行操作。

    lSession对象获取方式:

    •加载所有配置信息得到Configuraction对象

    •由Configuraction对象,创建出SessionFactory对象

    •由SessionFactory对象,在连接池中获取某个数据连接对象

    •将连接对象包装成Session对象返回给开发者使用

    lSession对象在数据库连接池中对应的连接对象是唯一的,使用完毕后,关闭Session时,对应绑定的数据库连接对象也将被释放,交由数据库连接池进行维护,清理本次操作过程中Session对象所携带的所有数据。

    l操作过程中,如果不关闭Session对象,将带来灾难性的后果,一旦数据库连接池中的连接无法正常回收,当达到数据库连接池上限时,将无法获取可用的连接对象。

    lSession对象的生命周期交由开发者管理是存在风险性的,因此Hibernate提供了3种Session对象的管理模式

    •Session对象生命周期由开发者管理

    •Session对象生命周期与JTA事务绑定

    •Session对象生命周期由本地线程管理

    lJTA(Java Transaction API ),Java事务架构,允许用户进行分布式事务处理(Spring中讲解)

    •事务传播属性

    •事务嵌套的模拟(2PC协议)

    本地线程管理Session对象

    l本地线程管理Session对象即使用当前应用程序的线程绑定一个固定的Session对象,无论在何处,只要获取Session对象,获取到的均为同一对象

    l本地线程管理实现机制

    •在Hibernate中创建本地线程管理Map<Thread,Session>

    •当出现新的线程时,如果在线程中获取Session对象将调用map的获取方法,传入当前线程对象作为key

    •如果未发现对应的Session对象,从SessionFactory处获取一个全新的Session对象,然后添加到map中

    •如果发现了对应的Session对象,直接使用

    •线程消亡时执行对应的关闭Session的操作

    l本地线程管理Session对象的生命周期

    •Session对象的初始化操作发生在第一次调用Session对象时

    •在线程对象未销毁前,可以使用Session提供的各种操作

    •当线程对象销毁时,关闭对应的Session

    l注意:如果手工关闭Session对象,会造成当前线程丢失对Session对象的控制权,关闭Session操作之后,所有获取当前线程绑定Session对象的操作将无法正常运行,抛出异常。使用本地线程管理Session不能手工执行close()操作。

    本地线程管理Session对象步骤

    l在hibernate.cfg.xml配置文件中,设置Session对象由本地线程维护

    image

    l在应用程序中获取当前绑定Session对象

    image

    l注意:

    •本地Session绑定当前线程,如果当前线程发生意外,可能会造成对应的Session对象无法被释放,永久性占用数据库连接

    •(警告)本地Session通常只应用于数据层开发,尽量不要挪至其它层,否则将出现无法控制的现象

  • 相关阅读:
    unable to retrieve container logs for docker kubernetes
    Restart container within pod
    Kubernetes1.3:POD生命周期管理
    Options of the DB storage of prometheus
    prometheus重启hang住问题记录
    prometheus交流资源
    nc 从服务器上传下载文件
    负载均衡监控需求
    prometheus消耗内存问题
    10.Docker 镜像使用
  • 原文地址:https://www.cnblogs.com/xyhero/p/9351862.html
Copyright © 2011-2022 走看看