- ベストアンサー
JDBC ドライバーのロードの方法について
すみませんが、どなたか教えていただけないでしょうか。 JDBCを使ってデータベースにアクセスしようとする場合に、まずドライバーのロードが必要ですが、 1.Class.forName("ドライバー名"); 2.Class.forName("ドライバー名").newInstance(); 1の方法と2の方法の違いは何かあるのでしょうか?今まで私は1の方法を使っていたのですが、2の方法があると知り、どのようなときに使うものなのかわかりません。このようなときにはこっちを使う、というようなルールや目安などありましたら、教えていただけますでしょうか。 ちなみに私は、データベースはDB2を使っています。 ↓また、以前に似たような(?)質問も見受けられたのですが、私にはちょっと難しくて理解できませんでした… http://okweb.jp/kotaeru.php3?q=642489 どうぞよろしくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
結論は「Class.forName(driver);」で良いと思います。 Class.forName(driver); Connection con = DriverManager.getConnection(url, user, password); この2行をセットで考えたほうが分かりやすいのではないでしょうか。 Clas.forName(...)は、DriverManagerに「driver」を登録する処理ですから、ドライバのインスタンス自体は必要ないんです。 http://okweb.jp/kotaeru.php3?q=642489を今見ましたが、私が比較的分かりやすいなと思ったのは、ANo.#2さんの回答でした。
その他の回答 (3)
- yutopapa
- ベストアンサー率47% (139/295)
#1です。 >という理解でよろしいのでしょうか? その理解で良いですよ。 >newInstance()を記述する/しないの違いは、インスタンスが作成されるかどうか、ということになりますか? その通りです。そのインスタンス自体のリソースが(僅かでしょうが)無駄になります。 >ところで、NOPとは、なんでしょうか? NOP=NO OPERATION で「何も処理しない」という意味です。 最近のプログラマさんには通じなかったみたいですね。 ハハハ、歳がばれる。(^^;
お礼
たびたび、ありがとうございます。 おかげさまで、すっきり納得することができました!ありがとうございました!! NOP、今度から使ってみます☆でも、私の本職はプログラマではないので、使う機会はなかなかないかしら…(笑)
#1の通りで、#2のように使えば良いでしょう。 補足的に記述すると、 http://okweb.jp/kotaeru.php3?q=642489 に書かれていることはそのまんまなのですが、Class#forNameの本来の役割と、JDBCドライバをロードする場合にどうなるか、とでわかりにくくなっているのではないかと思います。 -------------------------- ・JDBCドライバではない場合 -------------------------- Class cls = Class.forName("Hogehoge"); として、動的にHogehogeクラスをロードして、Classオブジェクトを生成します。 ただし、Hogehogeクラスのインスタンスは生成されていないので、Hogehogeオブジェクトを利用するには、 Hogehoge hh = cls.newInstance(); として、Hogehogeクラスのインスタンスを生成(コンストラクタが実行)する必要があります。 面倒なので、1行で記述することにすれば、以下のようになります。 Hogehoge hh = Class.forName("Hogehoge").newInstance(); これは、Hogehogeクラスをロードしつつ、なおかつコンストラクタを呼び出して、インスタンスを生成している、つまり、 Hogehoge hh = new Hogehoge(); とやっているのと、あまり代わりはありません。 代わりはないのだったら、なんで最初からそうしないのかというと、「動的にCLASSをロードする」ために使用するからです。 要は、forName(~)の「~」の部分を動的に変化させて使用したい場合に使うけです。 -------------------- ・JDBCドライバの場合 -------------------- 質問No.642489の説明の通り、JDBCドライバは、DriverManagerに登録されて、はじめて機能すると考えてください。 その登録作業が、下記の記述です。 Class.forName("ドライバー名"); 各JDBCドライバは、コンストラクタでは何も処理していませんから、DriverManagerに登録した後は、DriverManagerに任せて、接続処理をすれば良いだけです。 わざわざインスタンスを生成するまでもありません。 JDBCドライバがロードされた後は、接続処理をすれば良いだけなので、#1で書かれているように、わざわざ Class.forName("ドライバー名").newInstance(); などとインスタンスを生成するのは冗長な処理と言って良いでしょう。 DriverManagerが実際どう動いているか、詳しいところまでは理解していないので明言できませんが、わざわざここで別途インスタンスを生成すると、多少リソースを喰うと思いますので、若干リソースの無駄になるでしょう。 (喰わないかもしれませんし、喰っても気にするほどのものではないと思いますが) ですから、どちらを使っても間違いではありませんが、冗長ではない方、つまり、 Class.forName("ドライバー名"); を使用した方が良いと思います。 以上、私の勘違いや間違いがあるかもしれませんので、参考にとどめていただいて、後は色々検索等で調べたり書籍を読むなりして、確かめていただければと思います。 蛇足になりますが、直接JDBCドライバをロードする方法だけでなく、JNDIを使用したやり方も調べておくと良いと思いますよ。
お礼
ご回答、ありがとうございました! 確かに私は、Class.forName()の本来の動きと、JDBCドライバーをロードするときの動きを混乱させてしまっていました。このご説明をいただいて、ようやく整理がついてきたようです。 JNDIを使用したJDBCドライバーのロード、もあるんですか?調べてみますね。 とても勉強になりました。ありがとうございました!
- yutopapa
- ベストアンサー率47% (139/295)
なんて説明しようかな・・・。 結論から言うと「どっちでも同じ」です。 違いはありませんので使い分ける必要はありません。 ※但し、JDBCドライバの接続の為にClass.forName()を 使う場合での話です。 で、何が違うかというと、 Class.forName("hogehoge").newInstance(); は、クラスhogehogeをロードし、そのインスタンスを生成するという処理です。インスタンスを生成するという事は、そのクラスのコンストラクタが実行されます。 Class.forName("hogehoge") は、クラスhogehogeをロードするだけです。コンストラクタは実行されません。 ここで、staticブロックについてご理解されているかどうか問われます。 staticブロックは、クラスがロードされた瞬間に自動的に実行される処理だと理解して下さい。 で、件のJDBC Driverの場合、コンストラクタは空で、何も処理していません。 staticブロックで初期化処理を記述しています。 これはClass.forName()しただけで実行されますので、どちらの場合でも実行されます。 そして、newInstance()でコンストラクタを実行するかしないか、の違いでしかなく、そのコンストラクタはNOPですので意味はありません。 そういう意味では、JDBC Driverをロードする場合に Class.forName("ドライバー名").newInstance(); とやるのは、蛇足っぽい感じがしますね。 ・・・というのが私の理解なのですが、間違ってたらごめんなさい。(^^;
お礼
早速のご回答、ありがとうございました。少し理解を超えてしまった部分があるので、もう少し、教えていただけますか?お手数をおかけしますが、どうぞよろしくお願いいたします。
補足
Class.forName()を実行すると、staticブロックが実行される。newInstance()を実行すると、コンストラクタが実行され、インスタンスが作成される。 JDBC Driverクラスは、staticブロックに初期化処理が記述され、コンストラクタには何も記述されていないため、newInstance()を記述しても、実際には何も処理がされない。 という理解でよろしいのでしょうか? newInstance()を記述する/しないの違いは、インスタンスが作成されるかどうか、ということになりますか?たとえコンストラクタが空であっても、インスタンスは作成されますよね…? ところで、NOPとは、なんでしょうか? お手数をおかけいたしますが、よろしくお願いいたします。
お礼
早速のご回答、ありがとうございます。ドライバクラスのインスタンスは必要ないから、newInstance()は記述の必要がない、ということなんですね。すっきり、納得しました。本当にありがとうございました。