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对象由本地线程维护
l在应用程序中获取当前绑定Session对象
l注意:
•本地Session绑定当前线程,如果当前线程发生意外,可能会造成对应的Session对象无法被释放,永久性占用数据库连接
•(警告)本地Session通常只应用于数据层开发,尽量不要挪至其它层,否则将出现无法控制的现象