线程安全hibernate的session管理类实现

序:最近在学hibernate框架,按照threadlocal的思维来实现了一个hibernate的session管理类,因为一本书上的资料,但是发现他的写法不是线程安全的,所以这里我实现了一个线程安全的session管理类,顺便复习一下锁的知识。

代码:

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

public class HibernateUtil {
    //会话工厂
    private static SessionFactory sessionFactory;

    //读写锁
    private static ReadWriteLock rwlock=new ReentrantReadWriteLock();

    //ThreadLocal类
    private static final ThreadLocal<Session> threadLocal =new ThreadLocal<Session>(){
        @Override
        protected Session initialValue() {
            //获取session可以并行执行,但与重构factory互斥,所以上读锁。
            rwlock.readLock().lock();
            try {
                return sessionFactory.openSession();
            }catch (Exception ex){
                //创建session失败
                ex.printStackTrace();
                return null;
            }finally {
                rwlock.readLock().unlock();
            }
        }

        @Override
        public void remove() {
            Session session=get();
            session.close();
            set(null);
        }
    };

    static {
        //初始化时创建session工厂
        Configuration cfg=new Configuration().configure();
        sessionFactory=cfg.buildSessionFactory();
    }

    //获取Session
    public static Session getSession() throws HibernateException{
        return threadLocal.get();
    }

    //获取会话工厂
    public static SessionFactory getSessionFactory(){
        return sessionFactory;
    }

    //关闭Session
    public static void closeSession() throws HibernateException{
        threadLocal.remove();
    }

    //重建会话工厂
    public static void rebuildSessionFactory(){
        //重构factory与所有相关操作互斥,所以上写锁。
        rwlock.writeLock().lock();
        try {
            Configuration cfg=new Configuration().configure();
            sessionFactory.close();
            sessionFactory=cfg.buildSessionFactory();
        }catch (Exception ex){
            ex.printStackTrace();
        }finally {
            rwlock.writeLock().unlock();
        }
    }
}

这里我选择把session创建和关闭的过程都封装到threadlocal的重构方法中,这样可以方便实现和减少程序耦合度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值