awp001

posts(5) comments(21) trackbacks(0)
  • BlogJava
  • 联系
  • RSS 2.0 Feed 聚合
  • 管理

常用链接

  • 我的随笔
  • 我的评论
  • 我的参与
  • 最新评论

留言簿

  • 给我留言
  • 查看公开留言
  • 查看私人留言

随笔分类

  • GIS(1)
  • Hibernate(2)
  • JDK(1)
  • 设计模式(1)

随笔档案

  • 2010年6月 (1)
  • 2009年10月 (1)
  • 2007年5月 (3)

搜索

  •  

最新评论

  • 1. re: TileCache安装与配置全程攻略
  • 评论内容较长,点击标题查看
  • --刘良亮
  • 2. re: 关于Java缺乏多继承机制的探讨[未登录]
  • 中间再加一层抽象类……
  • --迷你狐
  • 3. re: 关于Java缺乏多继承机制的探讨
  • 评论内容较长,点击标题查看
  • --隔叶黄莺-2
  • 4. re: 关于Java缺乏多继承机制的探讨
  • 评论内容较长,点击标题查看
  • --Robin's Java World
  • 5. re: 关于Java缺乏多继承机制的探讨
  • C/S客户端可以直接调用service层、传递VO对象(其实就是ActionForm)
    为何还要再写个MyClassForm
  • --ekdd

阅读排行榜

评论排行榜

View Post

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

      上一篇中: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的具体类了。

      

posted on 2007-05-20 08:00 awp001 阅读(2078) 评论(3)  编辑  收藏 所属分类: Hibernate

View Comments

# re: Hibernate源代码分析(二):设计属于我的SessionFactory和ConnectionProvider  回复  更多评论   
怎么就没有下文了呢
2008-12-22 09:55 | jjtking
# re: Hibernate源代码分析(二):设计属于我的SessionFactory和ConnectionProvider  回复  更多评论   
浏览到此,还不错。如有时间,请多做一些此种工作。非常感谢。
2009-03-04 14:41 | 游客
# re: Hibernate源代码分析(二):设计属于我的SessionFactory和ConnectionProvider  回复  更多评论   
多谢,下文呢,速度啊,大家都在这撇着呢,那撇的是相当难受
2009-04-01 10:41 | xx
新用户注册  刷新评论列表  

只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问   管理
相关文章:
  • Hibernate源代码分析(二):设计属于我的SessionFactory和ConnectionProvider
  • Hibernate源代码分析(一):设计属于我的SessionFactory和ConnectionProvider
 
 
Powered by:
BlogJava
Copyright © awp001