- PR -

Class.forName("foo")とDriverManager.getConnection("bar")の間には?

1
投稿者投稿内容
KaNi
常連さん
会議室デビュー日: 2003/06/04
投稿数: 36
お住まい・勤務地: 埼玉県
投稿日時: 2004-10-15 15:26
JDBCのおなじみのフレーズですが、Class.forName("foo")で登録したドライバは
どうやってDriverManager.getConnection("bar")で使われているのか、ソース
上からは関連が見えないじゃないかと質問されて、自分もよく分かってないこと
に気が付きました。

Webで自分なりに調べてみて、

1)Class.forName("foo")でロードされる。
2)(どこか&なにか)で"foo"がnewされて DriverManager.deregisterDriver()に投げられる。
3)DriverManagerのクラスメンバ(?)に格納される。
4)DriverManager.getConnection()では2)で格納されたdriverを使う。

の様な感じなのかと思ったのですが、理解は正しい方向へ向かっているでしょうか。

「この本orサイトを読むと分かるよ」みたいな情報でもいただけたらうれしいです。
佐々木
大ベテラン
会議室デビュー日: 2003/03/30
投稿数: 121
投稿日時: 2004-10-15 15:50
引用:

JDBCのおなじみのフレーズですが、Class.forName("foo")で登録したドライバは
どうやってDriverManager.getConnection("bar")で使われているのか、ソース
上からは関連が見えないじゃないかと質問されて、自分もよく分かってないこと
に気が付きました。



ドライバのstaticイニシャライザでDriverManager.registerDriver(Driver)を呼んでるんじゃないですかね。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-10-15 15:54
1)Class.forName("foo")でfooクラスがロードされる。
2)fooクラスの静的初期化子でDriverManager.registerDriver()を実行し、自分自身を登録する。
3)DriverManagerのクラスメンバに格納される。
4)DriverManager.getConnection()では格納されたdriverクラスを使って片っ端から接続を試みる。

引用:

「この本orサイトを読むと分かるよ」みたいな情報でもいただけたらうれしいです。


標準ライブラリやドライバクラスのソースを見るのがいいと思います。
KaNi
常連さん
会議室デビュー日: 2003/06/04
投稿数: 36
お住まい・勤務地: 埼玉県
投稿日時: 2004-10-15 16:53
こんにちは。

お恥ずかしながら「static initializer」を知りませんでした。
コンストラクタじゃnewするときだから違うよなーなどと思ってました。

つい最近に話題に上がってますね。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=15319&forum=12&3

どうもありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)