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

来源:互联网 发布:java zookeeper 注册 编辑:程序博客网 时间:2024/05/17 03:34
上一篇中:Hibernate源代码分析(一):设计属于我的SessionFactory和ConnectionProvider 分析到了SessionFactoryImpl.openSession()方法,该方法将其
职责委托给了SessionImpl,打开org.hibernate.impl.SessionImpl.java,看看实现代码:

 1    SessionImpl(
 2            final Connection connection,
 3            final SessionFactoryImpl factory,
 4            final boolean autoclose,
 5            final long timestamp,
 6            final Interceptor interceptor,
 7            final EntityMode entityMode,
 8            final boolean flushBeforeCompletionEnabled,
 9            final boolean autoCloseSessionEnabled,
10            final ConnectionReleaseMode connectionReleaseMode) {
11        super( factory );
12        this.rootSession = null;
13        this.timestamp = timestamp;
14        this.entityMode = entityMode;
15        this.interceptor = interceptor;
16        this.listeners = factory.getEventListeners();
17        this.actionQueue = new ActionQueue( this );
18        this.persistenceContext = new StatefulPersistenceContext( this );
19        this.flushBeforeCompletionEnabled = flushBeforeCompletionEnabled;
20        this.autoCloseSessionEnabled = autoCloseSessionEnabled;
21        this.connectionReleaseMode = connectionReleaseMode;
22        this.jdbcContext = new JDBCContext( this, connection, interceptor );
23
24        if ( factory.getStatistics().isStatisticsEnabled() ) {
25            factory.getStatisticsImplementor().openSession();
26        }

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

31    }


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

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

 1    public JDBCContext(Context owner, Connection connection, Interceptor interceptor) {
 2        this.owner = owner;
 3        this.connectionManager = new ConnectionManager(
 4                owner.getFactory(),
 5                this,
 6                owner.getConnectionReleaseMode(),
 7                connection,
 8                interceptor
 9            );
10
11        final boolean registerSynchronization = owner.isAutoCloseSessionEnabled()
12                || owner.isFlushBeforeCompletionEnabled()
13                || owner.getConnectionReleaseMode() == ConnectionReleaseMode.AFTER_TRANSACTION;
14        if ( registerSynchronization ) {
15            registerSynchronizationIfPossible();
16        }

17    }

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

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

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

10        catch (SQLException sqle) {
11            throw JDBCExceptionHelper.convert(
12                    factory.getSQLExceptionConverter(),
13                    sqle,
14                    "Cannot open connection"
15                );
16        }

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

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

      接下来我们可以设计实现ConnectionProvider的具体类了。
原创粉丝点击