hibernate一些底層實現的解析

一、SessionFactory.openSession()

1、獲取Connection

這裏會通過調用hibernate的ConnectionProvider接口的getConnection()獲取Connection,而實際執行的有三個類繼承ConnectionProvider:

    1、DatasourceConnectionProviderImpl通過數據源獲取:dataSource.getConnection();

    2、DriverManagerConnectionProviderImpl通過ConnectionCreator獲取:connectionCreator.createConnection();

    3、UserSuppliedConnectionProviderImpl僅僅是拋出異常;

這裏詳細說明一下第一種:hibernate和各種連接池的聯繫是通過java的DateSource,hibernate使用DateSource的接口,各種連接池提供DateSource的實現類。而我們則是把該實現類定義爲Bean。比如在tomcat.jdbc.pool中,dataSource.getConnection()這個方法實際上是通過連接池的ConnectionPool的ProxyClassConstructor.newInstance()獲取Connection。

2、openSession()的實現代碼(hibernate),簡略:

package org.hibernate.internal;

import java.sql.Connection;

import org.hibernate.Interceptor;
import org.hibernate.Session;
import org.hibernate.SessionEventListener;
import org.hibernate.engine.spi.SessionBuilderImplementor;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.engine.spi.SessionOwner;
import org.hibernate.internal.SessionImpl;

public final class SessionFactoryImpl implements SessionFactoryImplementor {
	
	static class SessionBuilderImpl implements SessionBuilderImplementor {
		
		private final SessionFactoryImpl sessionFactory;
		private Connection connection;
		
		@Override
		public Session openSession() {
			final SessionImpl session = new SessionImpl(
					connection,
					sessionFactory,
					sessionOwner,
					getTransactionCoordinator(),
					getTransactionCompletionProcesses(),
					autoJoinTransactions,
					sessionFactory.settings.getRegionFactory().nextTimestamp(),
					interceptor,
					flushBeforeCompletion,
					autoClose,
					connectionReleaseMode,
					tenantIdentifier
			);

			for ( SessionEventListener listener : listeners ) {
				session.getEventListenerManager().addListener( listener );
			}

			return session;
		}
	}

}
因此有時候我們說:Hibernate session就是java.sql.Connection的一層高級封裝,一個session對應了一個Connection。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章