Hibernate的session是怎么创建的
2个回答
推荐于2018-04-05 · 知道合伙人互联网行家
关注
展开全部
Hibernat 对数据库的操作是通过Session来实现的,这里的session不同于页面间传递参数的session,
而是类似于JDBC中的 Connection。Session是Hibernate运作的中心,对象的生命周期、事务的管理、数据库的存取都与session息息相关。
Session是由HibernateSessionFactory创建的,是线程安全的,可以让多个执行线程同时存取
HibernateSessionFactory而不会有数据共享的问题,但不能让多个线程共享一个Session。
SessionFactory对象的创建:
Java代码
Configuration cfg = new Configuration().configure();
SessionFactory sessions = cfg.buildSessionFactory();
session创建时使用了一个ThreadLocal类来建立一个Session管理的辅助类,使用ThreadLocal可以有效隔离执行所用的数据,
避开了Session的多线程之间的数据共享问题。
//创建一个线程本地变量。
Java代码
public static final ThreadLocal<Session> threadlocal = new ThreadLocal<Session>();
public static org.hibernate.SessionFactory sessionFactory;
//获取session的方法
public static Sessin getSession() throws HibernateException{
//返回线程局部变量的当前线程的值
Session s = (Session)threadLocal.get();
//如果sessionFactory为空,重新创建sessionFactory;如果线程为空,就打开一个新的session
if(session==null || !session.isOpen()){
if(sessionFactory == null){
rebuildSessionFactory(); session = (sessionFactory != null) sessionFactory.openSession():null;
// 将hibernate的session放入到线程中保存;只要这个线程不结束,都可以通过线程的get()方法来获取
threadLocal.set(session);return session;
而是类似于JDBC中的 Connection。Session是Hibernate运作的中心,对象的生命周期、事务的管理、数据库的存取都与session息息相关。
Session是由HibernateSessionFactory创建的,是线程安全的,可以让多个执行线程同时存取
HibernateSessionFactory而不会有数据共享的问题,但不能让多个线程共享一个Session。
SessionFactory对象的创建:
Java代码
Configuration cfg = new Configuration().configure();
SessionFactory sessions = cfg.buildSessionFactory();
session创建时使用了一个ThreadLocal类来建立一个Session管理的辅助类,使用ThreadLocal可以有效隔离执行所用的数据,
避开了Session的多线程之间的数据共享问题。
//创建一个线程本地变量。
Java代码
public static final ThreadLocal<Session> threadlocal = new ThreadLocal<Session>();
public static org.hibernate.SessionFactory sessionFactory;
//获取session的方法
public static Sessin getSession() throws HibernateException{
//返回线程局部变量的当前线程的值
Session s = (Session)threadLocal.get();
//如果sessionFactory为空,重新创建sessionFactory;如果线程为空,就打开一个新的session
if(session==null || !session.isOpen()){
if(sessionFactory == null){
rebuildSessionFactory(); session = (sessionFactory != null) sessionFactory.openSession():null;
// 将hibernate的session放入到线程中保存;只要这个线程不结束,都可以通过线程的get()方法来获取
threadLocal.set(session);return session;
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个是框架开发者设计的,没有为什么,只是把原生的java连接数据库的代码,和一些常用的操作进行了一层封装,使开发人员使用更简单,下面再详细介绍一下Session:(1)单线程的,短寿命的对象,代表了一次会话的过程。实际上是把一个JDBCConnection打包了,它可以包含一些持久化对象的缓存看作介于数据连接与事物管理一种中间接口.在hibernate的设计者中.他们将session看作介于数据连接与事物管理的一种中间接口或者想象成一个持久对象的缓冲区hibernate能检测到这些持久对象的改变,并及时刷新数据库(2)每一个Session实例和一个数据库事务绑定通常将每一个Session实例和一个数据处理库事务绑定就是说,每执行一个数据库事务(操作),都应该先创建一个新的Session实例.如果事务执行中出现异常,应该撤消事务.不论事务执行成功与否,最后都应该调用Session的close()方法,从而释放Session实例占用的资源.(3)如何获得Session对象首先创建SessionFactory对象应用服务器如果访问多个数据源时,则应该产生多个SessionFactory;但是仅仅为了服务与某个请求时,不要创建一个新的SessionFactory,因为创建SessionFactory需要消耗大量的资源.然后根据SessionFactory再创建Session对象
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询