2011-01-09 20 views
10

Class.forName("com.mysql.jdbc.Driver");Class.forName("com.mysql.jdbc.Driver").newInstance();の両方がなぜデータベースに接続するのに使われるのか不思議でした。新しいインスタンスは作成されていないので、正しく、前者は動作しないはずはありません。それでも、それはまだ動作します。私はnetbeansを使用して6.9.1。あなたのご意見ありがとうございます!JDBC接続 - Class.forNameとClass.forName()。newInstance?

答えて

10

Class.forName("xxx")は、データベースへの接続を作成せず、JDBCドライバをロードして登録し、その後のDriverManager.getConnection(...)コールが機能するように登録します。ドライバを自分でインスタンス化する必要はありません。

+0

ありがとうございました!最後にqn-インスタンス化すると、後続のDriverManager.getConnection(..)は再びインスタンス化しません。それはあなたが最初のステップでそれをインスタンス化しなかった場合にのみそうするだろうか? – OckhamsRazor

+0

私は、クラスをロードするだけで、ドライバマネージャはドライバでスタティックブロックによってトリガされていることを既にインスタンス化していると考えます。正直言って、私は完全には分かりません。インスタンス化したドライバを使用する場合は、DriverManagerを使用して接続を取得したり、DriverManager静的メソッドを使用して独自のドライバインスタンスを登録したりする必要はありません。 – araqnid

1

jdbc 4.0をサポートするドライバでは、Class.forName()も必要ありません。 ドライバは、DriverManagerがそれを調べるときに、その場でロードするために構築されたメカニズムである を持っているはずです。

(参考:http://download.oracle.com/javase/6/docs/api/java/sql/DriverManager.html) DriverManagerのメソッドgetConnectionおよびgetDriversがJava Standard Edition Service Providerメカニズムをサポートするように拡張されました。 JDBC 4.0ドライバには、META-INF/services/java.sql.Driverファイルが含まれている必要があります。このファイルには、java.sql.DriverのJDBCドライバ実装の名前が含まれています。

アプリケーションはもはや必要

my.sql.Driver明示的に:たとえば、my.sql.Driverクラスをロードするために、META-INF /サービス/に、java.sql.driverファイルにはエントリが含まれますClass.forName()を使用してJDBCドライバをロードします。 Class.forName()を使用して現在JDBCドライバをロードしている既存のプログラムは、修正を行わずに引き続き動作します。

関連する問題