いまさらながらClass.forNameでJDBCドライバをどう読み込んでるのよ??を調べてみる

データベースへ接続する際におなじみのClass.forName("hoge.hoga.DBDriver")ですが、ひとまず書いておけばいいやレベルでしか認識していなかったので改めて何をやっているか調べてみました。

  1. Class.forName("hoge.hoga.DBDriver")でhoge.hoga.DBDriverクラスがロードされる。
  2. hoge.hoga.DBDriverクラスの静的初期化子(スタティックイニシャライザー)でDriverManager.registerDriver()を実行し、自分自身を登録する。
  3. DriverManagerのクラスメンバに格納される。
  4. DriverManager.getConnection()にて、格納されたdriverクラスを登録された順に接続を試みる。

下のソースコードMySQLJDBCドライバの一部です

static {
  try {
    java.sql.DriverManager.registerDriver(new Driver());
  } catch (SQLException E) {
    throw new RuntimeException("Can't register driver!");
  }
}

こんな感じで各JDBCドライバは自分自身をDriverManagerに登録するように作られているのです。