2011-01-09 15 views
10

Mi chiedevo perché entrambi gli apparecchi Class.forName("com.mysql.jdbc.Driver"); e Class.forName("com.mysql.jdbc.Driver").newInstance(); funzionino quando li utilizzo per connettersi a un database. Di diritto, non è il primo che non dovrebbe funzionare, poiché non è stata creata alcuna nuova istanza. Eppure, funziona ancora. Sto usando netbeans 6.9.1. Grazie per il tuo contributo!Connessione JDBC - Class.forName vs Class.forName(). NewInstance?

risposta

10

Class.forName("xxx") non crea una connessione al database, carica semplicemente il driver JDBC e lo registra in modo che una successiva chiamata DriverManager.getConnection(...) funzioni. L'istanziazione del driver non è necessaria.

+0

grazie! un ultimo qn- se lo istanziate, quindi il successivo DriverManager.getConnection (..) non lo riattribuirà di nuovo, corretto? Lo farà solo se non lo hai istanziato nel primo passaggio? – OckhamsRazor

+0

Sospetto che solo caricando la classe, il gestore driver lo abbia già istanziato, attivato da un blocco statico nel driver. Ad essere onesti, non ne sono del tutto sicuro. Se si desidera utilizzare il driver che è stato istanziato (ad esempio per avvolgerlo), è necessario evitare di utilizzare DriverManager per ottenere connessioni o registrare la propria istanza del driver utilizzando i metodi statici di DriverManager. – araqnid

1

Con un driver che supporta jdbc 4.0 non è nemmeno necessario Class.forName(). Il driver dovrebbe avere un meccanismo incorporato per caricarsi al volo, quando DriverManager lo cerca.

(ref: http://download.oracle.com/javase/6/docs/api/java/sql/DriverManager.html) I metodi DriverManager getConnection e getDrivers sono stati migliorati per supportare il meccanismo Provider Java Standard Edition Service. I driver di JDBC 4.0 devono includere il file META-INF/services/java.sql.Driver. Questo file contiene il nome dell'implementazione dei driver JDBC di java.sql.Driver. Per esempio, per caricare la classe my.sql.Driver, il file META-INF/services/java.sql.Driver dovrebbe contenere la voce:

my.sql.Driver

applicazioni non hanno bisogno di più tempo per esplicitamente caricare i driver JDBC utilizzando Class.forName(). I programmi esistenti che attualmente caricano i driver JDBC utilizzando Class.forName() continueranno a funzionare senza modifiche.

Problemi correlati