• ベストアンサー

JDBC ドライバーのロードの方法について

すみませんが、どなたか教えていただけないでしょうか。 JDBCを使ってデータベースにアクセスしようとする場合に、まずドライバーのロードが必要ですが、 1.Class.forName("ドライバー名"); 2.Class.forName("ドライバー名").newInstance(); 1の方法と2の方法の違いは何かあるのでしょうか?今まで私は1の方法を使っていたのですが、2の方法があると知り、どのようなときに使うものなのかわかりません。このようなときにはこっちを使う、というようなルールや目安などありましたら、教えていただけますでしょうか。 ちなみに私は、データベースはDB2を使っています。 ↓また、以前に似たような(?)質問も見受けられたのですが、私にはちょっと難しくて理解できませんでした… http://okweb.jp/kotaeru.php3?q=642489 どうぞよろしくお願いいたします。

  • Java
  • 回答数4
  • ありがとう数6

質問者が選んだベストアンサー

  • ベストアンサー
  • dayowl
  • ベストアンサー率56% (84/148)
回答No.2

結論は「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さんの回答でした。

koyuki80
質問者

お礼

早速のご回答、ありがとうございます。ドライバクラスのインスタンスは必要ないから、newInstance()は記述の必要がない、ということなんですね。すっきり、納得しました。本当にありがとうございました。

その他の回答 (3)

  • yutopapa
  • ベストアンサー率47% (139/295)
回答No.4

#1です。 >という理解でよろしいのでしょうか? その理解で良いですよ。 >newInstance()を記述する/しないの違いは、インスタンスが作成されるかどうか、ということになりますか? その通りです。そのインスタンス自体のリソースが(僅かでしょうが)無駄になります。 >ところで、NOPとは、なんでしょうか? NOP=NO OPERATION で「何も処理しない」という意味です。 最近のプログラマさんには通じなかったみたいですね。 ハハハ、歳がばれる。(^^;

koyuki80
質問者

お礼

たびたび、ありがとうございます。 おかげさまで、すっきり納得することができました!ありがとうございました!! NOP、今度から使ってみます☆でも、私の本職はプログラマではないので、使う機会はなかなかないかしら…(笑)

noname#227796
noname#227796
回答No.3

#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を使用したやり方も調べておくと良いと思いますよ。

koyuki80
質問者

お礼

ご回答、ありがとうございました! 確かに私は、Class.forName()の本来の動きと、JDBCドライバーをロードするときの動きを混乱させてしまっていました。このご説明をいただいて、ようやく整理がついてきたようです。 JNDIを使用したJDBCドライバーのロード、もあるんですか?調べてみますね。 とても勉強になりました。ありがとうございました!

  • yutopapa
  • ベストアンサー率47% (139/295)
回答No.1

なんて説明しようかな・・・。 結論から言うと「どっちでも同じ」です。 違いはありませんので使い分ける必要はありません。 ※但し、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(); とやるのは、蛇足っぽい感じがしますね。 ・・・というのが私の理解なのですが、間違ってたらごめんなさい。(^^;

koyuki80
質問者

お礼

早速のご回答、ありがとうございました。少し理解を超えてしまった部分があるので、もう少し、教えていただけますか?お手数をおかけしますが、どうぞよろしくお願いいたします。

koyuki80
質問者

補足

Class.forName()を実行すると、staticブロックが実行される。newInstance()を実行すると、コンストラクタが実行され、インスタンスが作成される。 JDBC Driverクラスは、staticブロックに初期化処理が記述され、コンストラクタには何も記述されていないため、newInstance()を記述しても、実際には何も処理がされない。 という理解でよろしいのでしょうか? newInstance()を記述する/しないの違いは、インスタンスが作成されるかどうか、ということになりますか?たとえコンストラクタが空であっても、インスタンスは作成されますよね…? ところで、NOPとは、なんでしょうか? お手数をおかけいたしますが、よろしくお願いいたします。

関連するQ&A

  • JDBCドライバーのロードに関して

    参考書やwebページのソースコードにJDBCドライバーのロードのときに、Class.forName("...")と書いているものと、Class.forName("...").newInstance()と書いているものがあります。[...部分は省略]この二つのコードは、どこが違うのでしょうか。また、Sunmicroのホームページで、forNameメソッドは、"指定された文字列名を持つクラスまたはインタフェースに関連付けられた、Class オブジェクトを返します。"と、newInstanceメソッドは、"この Class オブジェクトが表すクラスの新しいインスタンスを生成します。"と書かれていますが、どうしてこれで、JDBCドライバーがロードされるのですか?また、初歩的な質問ですが、JDBCドライバーがロードされるというのは、どうゆうことですか?教えてください。

    • ベストアンサー
    • Java
  • ServletでJDBCを使う時

    servletでJDBCを使ってデータベースに接続しようと思っていますが、 servletのdoGetの中で、 Class.forName("com.mysql.jdbc.Driver"); と書くとClassNotFoundExceptionエラーになります。 public static Connection getConnection() などのクラスを作って、その中で Class.forName("com.mysql.jdbc.Driver"); と書くとエラーにはならないのですが、doGetの中では宣言できないのでしょうか?自分が何か勘違いしていたら申し訳ございません。 ご助言お願いいたします。

    • ベストアンサー
    • Java
  • JDBCドライバの登録と接続

    javaプログラムでDBにアクセスをする時はドライバの名前とURLをしていしなければいけないらしいですが、わからなく困っています。 データベースはmySQLというフリーのものをインストール済みです。 ドライバの登録にClas.forName("ドライバ名")というクラス、 データベースへの接続はDriverManager.getConnection("URL","ユーザー名","パスワード")というクラスを用いるのは分かっているのですが、 引数に指定するドライバ名とURLがわからないです。 DBに詳しい方、ご回答よろしくお願いします。

  • MySQLのJDBCドライバについて

    現在、MySQL3.2.3を使ってJSPの学習をしています。ドライバはmm.mysql-2.0.4-bin.jarを使用しています。 色々なホームページを調べると、 Class.forName(ドライバ名); のドライバ名が、org.gjt.mm.mysql.Driverとcom.mysql.jdbc.Driverの2つが紹介されているのですが 何が違うのでしょうか? ちなみに私の環境では前者の方だとうまくいくのですが後者だと javax.servlet.ServletException:com.mysql.jdbc.Driver のエラーになってしまいます。 MySQLのドライバによって違ってくるのでしょうか? 初歩的な質問で申し訳ございませんが教えてください。 その他環境: OS:Windows ME JDK1.4.0 Tomcat4.0 を使用しています。

    • ベストアンサー
    • Java
  • JDBCについて

    JDBCを用いたMySQLデータベースへの接続方法について質問があります。 【現在の状況】 tomcatをインストール済み(正常に作動・・・起動した状態で、http://localhost:8080/に接続できます。) MySQLをインストール済み(正常に作動・・・データベースを作成できます。(例えば、sampleとします。)) JDBCドライバをセットアップ済み(CLASSPATHの設定も問題ありません。) しかし 作成したデータをjavaプログラムを用いて表示しようとしたところ com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Access denied for user ''@'localhost' to database 'sample' というエラーが出てしまいました。 データベースへのアクセスが拒否されたとあるのですが 理由がわからずに困っております。 接続は、以下のようにしています。 Class.forName("com.mysql.jdbc.Driver"); Connection cn = DriverManager.getConnection("jdbc:mysql:///cardb", "", ""); 解決策をご存知の方いらっしゃいましたら 御指導願います。

    • ベストアンサー
    • Java
  • Class.forName("org.postgresql.Driver")の意味

    JDBCを使って、PostgreSQL を利用する場合、 まず最初に、Class.forName("org.postgresql.Driver")というのを使いますよね。 この、Class.forName(String str)メソッドは、str にある、クラスを初期化すると仕様書には書いてます。 (Class.forName("org.postgresql.Driver")).newInstance() を実行して、org.postgresql.Driver.class のコンストラクタを実行するというのなら、意味はわかるのですが、、、 ただClass.forName("org.postgresql.Driver")の命令だけを使ってなんの意味があるのでしょうか? 意味不明で困っています。どうか、よろしくお願い致します。

    • ベストアンサー
    • Java
  • JDBCでDBアクセスする際のユーザーID、パスワード等はハードコードして良い?

    ServletからJDBCによってデータベースにアクセスしようと思っております。 例えば次のようなサンプルが見つかりました。 (http://www.atmarkit.co.jp/fjava/rensai/jdbc02/jdbc02.html) class JavaDataAccess01 { public static void main (String args[]) throws SQLException, ClassNotFoundException { Class.forName("oracle.jdbc.driver.OracleDriver"); Connection conn = DriverManager.getConnection ("jdbc:oracle:thin:@localhost:1521:ORCL", "scott", "tiger");   ・・・省略・・・ } } サンプルにならって、自分のServletでも同様にやってみたところ、無事にデータベースにアクセスすることができました。 ただ、上記のユーザー名やパスワードをハードコードしている個所が気になりました。 DBの経験がないのでよく分からないのですが、実際の業務プログラムでもハードコードして良いものなのでしょうか。 また、ホスト名、ポート名、データベース名(上記のORCL)についても、プログラムに直接書いてしまって問題ないものなのでしょうか。 それとも、何らかの設定ファイルのような形で登録しておいたりするのでしょうか。

    • ベストアンサー
    • Java
  • DBの接続

    いつもお世話になります。 DBに接続するとき、ドライバクラスをロードする方法が分かりません。 Class.forName("xxx"); という形をしていると思うのですが、 xxxに入る文字列はどのようにして分かるのですか? helloworld(http://www.hellohiro.com/jdbc.htm)では sun.jdbc.odbc.JdbcOdbcDriverとなっていますが、 これをこのまま使うとエラーになります・・・ 基本的なことですが、よろしくお願いします。

    • ベストアンサー
    • Java
  • JDBCでaccessから取得したデータをjTableに表示させたい。

    JDBCでaccessのデータベースから取得したデータをjTableに表示させたいのですが どのようにしたらセルのデータやタイトルを入力させることができますか? またデータベースを操作したらその結果を表示させたいと考えています。どのようにすれば実現できるでしょうか? accessのデータベースには以下のように接続していました。 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); String str = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=hello.mdb"; Connection con = DriverManager.getConnection(str, "", ""); 開発環境はNetBeansを使用しています。

  • Javaでデータベースにアクセス

    するときに以下のように Class.forName (driver); をする必要があるのですが これの意味を教えてください なぜこれが必要なのでしょうか? ・・・・・・・・・・・・・ // JDBCドライバの登録 String driver = "org.postgresql.Driver"; // データベースの指定 String url = "jdbc:postgresql://fedorasrv.com/test"; //サーバ名またはIPアドレス+データベース名 String user = "fedora"; //データベース作成ユーザ名 String password = "XXXXXXXX"; //データベース作成ユーザパスワード Class.forName (driver); // データベースとの接続 Connection con = DriverManager.getConnection(url, user, password); ・・・・・・・・・・・・・・

    • ベストアンサー
    • Java

専門家に質問してみよう