03_HibernateSessionFactory源码分析

文章导读:

讲解了一个线程为什么要使用同一个connection, 我们分析了HiberatenSessionFactory的实现机制, 然后根据Hibernate的写法重构了我们的代码. 最后测试可以发现在同一个线程中只能得到同一个Connection. 

视频与源码下载:http://edu.51cto.com/lecturer/index/user_id-9166337.html  (代码在视频的附件中)

 

HibernateSessionFactory源码分析加载配置文件

 1 // 加载配置文件,返回SessionFactory
 2 static {
 3     try {
 4         configuration.configure(configFile);
 5         // 构建sessionFactory并且返回
 6         sessionFactory = configuration.buildSessionFactory();
 7     } catch (Exception e) {
 8         System.err.println("%%%% Error Creating SessionFactory %%%%");
 9         e.printStackTrace();
10     }
11 }

同一个线程获取同一个Session对象,就是采用ThreadLocal来实现的

 1 // 同一个线程获取同一个session对象
 2 public static Session getSession() throws HibernateException {
 3     // 查询当前threadLocal是否已存在session
 4     Session session = (Session) threadLocal.get();
 5     // 判断当前session是否可以使用
 6     if (session == null || !session.isOpen()) {
 7         // 如果sessionFactory不为空,则新创建一个session
 8         session = (sessionFactory != null) ? sessionFactory.openSession(): null;
 9         // 把创建的session存放到threadLocal中,这样就可以保证一个线程公用一个session
10         threadLocal.set(session);
11     }
12     // 返回session
13     return session;
14 }

关闭Session的实现

1 // 关闭不需要传入session,只需要到threadLocal去获取
2 public static void closeSession() throws HibernateException {
3     Session session = (Session) threadLocal.get();
4     threadLocal.set(null);
5     if (session != null) {
6         session.close();
7     }
8 }

根据源码分析重构我们自己的Connection

 1 // 获取connection链接对象
 2 public static Connection getConnection() {
 3     Connection connection = threadLocal.get();
 4     try {
 5         // 当前conn不存在,或者已经关闭
 6         if (connection == null || connection.isClosed()) {
 7             connection = DriverManager.getConnection(
 8                     "jdbc:mysql://127.0.0.1:3306/demo", "root", "root");
 9             threadLocal.set(connection);
10         }
11 
12         return connection;
13     } catch (SQLException e) {
14         throw new RuntimeException(e);
15     }
16 }

重构后测试结果如下:

1 public static void main(String[] args) {
2     // 一个线程一个Session方便后期事务实现
3     System.out.println(JdbcUtils.getConnection());
4     System.out.println(JdbcUtils.getConnection());
5 }

测试结果如下(一个线程同一个Conneciton)

1 com.mysql.jdbc.JDBC4Connection@7bb52a38
2 com.mysql.jdbc.JDBC4Connection@7bb52a38

 

转载于:https://www.cnblogs.com/jxyedu/p/6258928.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值