03_HibernateSessionFactory源码分析
文章导读:
讲解了一个线程为什么要使用同一个connection, 我们分析了HiberatenSessionFactory的实现机制, 然后根据Hibernate的写法重构了我们的代码. 最后测试可以发现在同一个线程中只能得到同一个Connection.
视频与源码下载:http://edu.51cto.com/lecturer/index/user_id-9166337.html (代码在视频的附件中)
HibernateSessionFactory源码分析加载配置文件
// 加载配置文件,返回SessionFactory
static {
try {
configuration.configure(configFile);
// 构建sessionFactory并且返回
sessionFactory = configuration.buildSessionFactory();
} catch (Exception e) {
System.err.println("%%%% Error Creating SessionFactory %%%%");
e.printStackTrace();
}
}
同一个线程获取同一个Session对象,就是采用ThreadLocal来实现的
// 同一个线程获取同一个session对象
public static Session getSession() throws HibernateException {
// 查询当前threadLocal是否已存在session
Session session = (Session) threadLocal.get();
// 判断当前session是否可以使用
if (session == null || !session.isOpen()) {
// 如果sessionFactory不为空,则新创建一个session
session = (sessionFactory != null) ? sessionFactory.openSession(): null;
// 把创建的session存放到threadLocal中,这样就可以保证一个线程公用一个session
threadLocal.set(session);
}
// 返回session
return session;
}
关闭Session的实现
// 关闭不需要传入session,只需要到threadLocal去获取
public static void closeSession() throws HibernateException {
Session session = (Session) threadLocal.get();
threadLocal.set(null);
if (session != null) {
session.close();
}
}
根据源码分析重构我们自己的Connection
1 // 获取connection链接对象
public static Connection getConnection() {
Connection connection = threadLocal.get();
try {
// 当前conn不存在,或者已经关闭
if (connection == null || connection.isClosed()) {
connection = DriverManager.getConnection(
"jdbc:mysql://127.0.0.1:3306/demo", "root", "root");
threadLocal.set(connection);
} return connection;
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
重构后测试结果如下:
public static void main(String[] args) {
// 一个线程一个Session方便后期事务实现
System.out.println(JdbcUtils.getConnection());
System.out.println(JdbcUtils.getConnection());
}
测试结果如下(一个线程同一个Conneciton)
com.mysql.jdbc.JDBC4Connection@7bb52a38
com.mysql.jdbc.JDBC4Connection@7bb52a38
03_HibernateSessionFactory源码分析的更多相关文章
- ABP源码分析一:整体项目结构及目录
ABP是一套非常优秀的web应用程序架构,适合用来搭建集中式架构的web应用程序. 整个Abp的Infrastructure是以Abp这个package为核心模块(core)+15个模块(module ...
- HashMap与TreeMap源码分析
1. 引言 在红黑树--算法导论(15)中学习了红黑树的原理.本来打算自己来试着实现一下,然而在看了JDK(1.8.0)TreeMap的源码后恍然发现原来它就是利用红黑树实现的(很惭愧学了Ja ...
- nginx源码分析之网络初始化
nginx作为一个高性能的HTTP服务器,网络的处理是其核心,了解网络的初始化有助于加深对nginx网络处理的了解,本文主要通过nginx的源代码来分析其网络初始化. 从配置文件中读取初始化信息 与网 ...
- zookeeper源码分析之五服务端(集群leader)处理请求流程
leader的实现类为LeaderZooKeeperServer,它间接继承自标准ZookeeperServer.它规定了请求到达leader时需要经历的路径: PrepRequestProcesso ...
- zookeeper源码分析之四服务端(单机)处理请求流程
上文: zookeeper源码分析之一服务端启动过程 中,我们介绍了zookeeper服务器的启动过程,其中单机是ZookeeperServer启动,集群使用QuorumPeer启动,那么这次我们分析 ...
- zookeeper源码分析之三客户端发送请求流程
znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个功能是zookeeper对于应用最重要的特性,通过这个特性可以实现的功能包括配置的 ...
- java使用websocket,并且获取HttpSession,源码分析
转载请在页首注明作者与出处 http://www.cnblogs.com/zhuxiaojie/p/6238826.html 一:本文使用范围 此文不仅仅局限于spring boot,普通的sprin ...
- ABP源码分析二:ABP中配置的注册和初始化
一般来说,ASP.NET Web应用程序的第一个执行的方法是Global.asax下定义的Start方法.执行这个方法前HttpApplication 实例必须存在,也就是说其构造函数的执行必然是完成 ...
- ABP源码分析三:ABP Module
Abp是一种基于模块化设计的思想构建的.开发人员可以将自定义的功能以模块(module)的形式集成到ABP中.具体的功能都可以设计成一个单独的Module.Abp底层框架提供便捷的方法集成每个Modu ...
随机推荐
- vuejs 组件 移动端push 没有渲染页面
this.idcards.push(arr) 这个无效 就知道了 vuejs有个跟push相同的方法 console.log(this.list.push.toString()) 这个push是个同名 ...
- C++ error:Debug Assertion Failed.Expression:_BLOCK_TYPE_IS_VALID(phead->nBlock)
Debug Assertion Failed.Expression:_BLOCK_TYPE_IS_VALID(phead->nBlockUse) 关于上面这个错误,我在上一篇文章中的程序遇到过了 ...
- 告别CMD.windows终端神器conemu设置
前言 一种刘姥姥进大观园的感觉,现在是见啥啥新鲜.因为之前不怎么接触到命令操作,平时偶尔用用cmd也没觉得什么不妥.直到现在经常调试脚本,使用git越发感觉不方便.看见同事使用的terminal绚丽夺 ...
- Game Engine Architecture
- 用Python完成根据日期计算是星期几
import datetime def week(year,month,day): someday=dayetime.date(year,month,day) result={ "0&quo ...
- 数据库之游标过程-- 基于MySQL
实例如下: DROP PROCEDURE IF EXISTS pr_change_station_user_acct_his; -- 如果存在存储过程,即删除存储过程 create procedure ...
- C#的位运算
链接地址: http://www.cnblogs.com/NetBelieve/archive/2012/07/30/2615006.html
- CF Gym 100187M Heaviside Function(二分)
题意:给你一个函数和一些系数,给你一堆询问,求函数值. 根据s的符号,分成两组讨论,函数值与比x小的系数数量有关,二分输出答案. #include<cstdio> #include< ...
- Problem T: 结构体--学生信息排序
Problem T: 结构体--学生信息排序 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 2219 Solved: 1305[Submit][Sta ...
- python之函数的初识
1. 面向过程编程的缺点 代码重复 代码可可读性不高 2. 函数的定义*** 函数是以功能为导向,一个函数封装一个功能.登录,注册,文件的改的操 3.函数的作用*** 函数减少代码的重复性,增 ...