Hibernate源代码分析(二):设计属于我的SessionFactory和ConnectionProvider

本文深入探讨Hibernate框架中数据库连接的获取过程,重点分析SessionImpl的构造方法与JDBCContext的初始化流程,揭示ConnectionProvider接口如何实现数据库连接的提供。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一篇中: Hibernate源代码分析(一):设计属于我的SessionFactory和ConnectionProvider 分析到了SessionFactoryImpl.openSession()方法,该方法将其
职责委托给了SessionImpl,打开org.hibernate.impl.SessionImpl.java,看看实现代码:

1 SessionImpl(
2 final Connectionconnection,
3 final SessionFactoryImplfactory,
4 final boolean autoclose,
5 final long timestamp,
6 final Interceptorinterceptor,
7 final EntityModeentityMode,
8 final boolean flushBeforeCompletionEnabled,
9 final boolean autoCloseSessionEnabled,
10 final ConnectionReleaseModeconnectionReleaseMode) {
11super(factory);
12this.rootSession=null;
13this.timestamp=timestamp;
14this.entityMode=entityMode;
15this.interceptor=interceptor;
16this.listeners=factory.getEventListeners();
17this.actionQueue=newActionQueue(this);
18this.persistenceContext=newStatefulPersistenceContext(this);
19this.flushBeforeCompletionEnabled=flushBeforeCompletionEnabled;
20this.autoCloseSessionEnabled=autoCloseSessionEnabled;
21this.connectionReleaseMode=connectionReleaseMode;
22this.jdbcContext=newJDBCContext(this,connection,interceptor);
23
24if(factory.getStatistics().isStatisticsEnabled()){
25factory.getStatisticsImplementor().openSession();
26}

27
28if(log.isDebugEnabled()){
29log.debug("openedsessionattimestamp:"+timestamp);
30}

31}


我们关注的就是数据库连接,重点关注第22行,在该行将Connection对象传递给了JDBCContext,通过观察前 面的代码我们可以发现,JTASessionContext.buildOrObtainSession() 方法传递的Connection对象为null,这个可以说,Connection对象的获得将由
ConnectionProvider接口的实现类来完成。

接下来看看JDBCContent类的构造函数,跳转到org.hibernate.jdbc.JDBCContent.java,程序代码如下:

1 public JDBCContext(Contextowner,Connectionconnection,Interceptorinterceptor) {
2this.owner=owner;
3this.connectionManager=newConnectionManager(
4owner.getFactory(),
5this,
6owner.getConnectionReleaseMode(),
7connection,
8interceptor
9);
10
11finalbooleanregisterSynchronization=owner.isAutoCloseSessionEnabled()
12||owner.isFlushBeforeCompletionEnabled()
13||owner.getConnectionReleaseMode()==ConnectionReleaseMode.AFTER_TRANSACTION;
14if(registerSynchronization){
15registerSynchronizationIfPossible();
16}

17}

这段程序代码里创建了一个新的对象connectionManager,我们跟踪一下org.hibernate.jdbc.ConnectionManager.java,在这个文件里可以
发现一个方法openConnection(),代码如下:

1 private void openConnection() throws HibernateException {
2if(connection!=null){
3return;
4}

5
6log.debug("openingJDBCconnection");
7try{
8connection=factory.getConnectionProvider().getConnection();
9}

10catch(SQLExceptionsqle){
11throwJDBCExceptionHelper.convert(
12factory.getSQLExceptionConverter(),
13sqle,
14"Cannotopenconnection"
15);
16}

17
18callback.connectionOpened();//registersynch;stats.connect()
19}

现在,最有价值的发现出来了,在第8行,这里就是从缓冲池获得数据库连接的代码。

接下来我们可以设计实现ConnectionProvider的具体类了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值