2015-01-29 7 views
6

ho letto qui sul SO che dal Java 6 non è più necessario registrarsi driver JDBC utilizzare:Class.forName (JDBC_DRIVER) non è più necessario?

Class.forName(JDBC_DRIVER); 

perché DriverManager utilizza il percorso si trova nella proprietà di sistema "jdbc.drivers" per recuperare il driver corretto.

Ma quando faccio il followng:

System.out.print(System.getProperty("jdbc.drivers")); 

null ottiene stampate.

Hai qualche idea del perché la mia app funziona correttamente ?? ;)

+2

E 'tutto spiegato nella documentazione: http://docs.oracle.com/javase/7/docs/api/java/sql/ DriverManager.html –

risposta

9

Questo non ha nulla a che fare con quella proprietà di sistema. Java6 (e JDBC4) hanno introdotto un concetto noto come "service provider" in cui le implementazioni dell'interfaccia conosciuta possono essere rilevate da JVM durante l'avvio. Un driver conforme è registrato automaticamente da DriverManager. Ecco perché lo Class.forName() non è più necessario, ma solo se il driver lo supporta.

La registrazione del servizio viene avviata se è presente una directory nel file jar del driver all'interno della directory META-INF. Tale directory deve contenere un file di testo con il nome dell'interfaccia implementata nel caso di un driver JDBC che sia java.sql.Driver contenente la classe di implementazione.

+1

Ciò significa che tutto ciò che devo fare è indicare la mia implementazione jar JDBC, giusto? cosa succede se indico più implementazione JDBC? – GionJh

+2

@ user986437 Sì, è sufficiente aggiungere un driver JDBC 4 sul classpath. Non ho provato con più driver, ma suppongo che quello selezionato verrà selezionato in base all'URL fornito (ogni driver supporta un URL diverso). – Puce

+1

È JDBC 4 non JDBC 3, che ha introdotto quel meccanismo; http://docs.oracle.com/javase/8/docs/api/java/sql/package-summary.html#package.description – Puce

2

Dalle Javadocs di DriverManager:

Nell'ambito della sua inizializzazione, la classe DriverManager tenterà di caricare le classi conducente riferimento nella proprietà di sistema "jdbc.drivers". Ciò consente all'utente di personalizzare i driver JDBC utilizzati dalle loro applicazioni. Per esempio nel vostro ~/.hotjava/proprietà del file è possibile specificare:

jdbc.drivers=foo.bah.Driver:wombat.sql.Driver:bad.taste.ourDriver 

Ciò significa che la proprietà di sistema deve essere specificato. Non dice che la classe riempirà automaticamente questa proprietà quando il driver è registrato.

Per quanto riguarda il motivo per cui l'applicazione funziona, è possibile controllare se si sta già chiamando il metodo DriverManager#registerDriver() (sebbene non sia necessario per la maggior parte dei driver). Se sì, allora il conducente è registrato. In caso contrario, l'applicazione potrebbe avere un file fornitore di servizi, come detto:

I DriverManager metodi 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 il my.sql.Driver class, il file META-INF/services/java.sql.Driver conterrà la voce:

+0

Non si deve chiamare il metodo 'registerDriver' da soli, ma si intende che venga chiamato dall'implementazione del driver JDBC stesso quando viene caricato. L'unica vera eccezione è se si usa un driver che non si registra da solo (e quasi tutti i driver JDBC si registrano da soli quando caricati, forse con l'eccezione dei driver speciali (non mainstream)). –

Problemi correlati