一、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。