2016-06-17 18 views
9

Dal Java documentationClass.forName sembra ancora necessario

Nelle precedenti versioni di JDBC, per ottenere una connessione, si doveva prima di inizializzare il driver JDBC chiamando il metodo Class.forName.

Tutti i driver JDBC 4.0 che si trovano nel percorso della classe vengono caricati automaticamente. (Tuttavia, è necessario caricare manualmente i driver prima di JDBC 4.0 con il metodo Class.forName.)

Ho un webservice jersey, che si connette a SQL Server Express 2016. Ha sqljdbc42.jar che è 4.2 conducente, nel CLASSPATH

Tuttavia, se tralascio la chiamata Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"), il mio DriverManager.getConnection tiri un (Nessun driver adatto trovato per JDBC: sqlserver: // localhost: 1433; .... ") SQLException

I getConnection inizia successo una volta aggiungo la chiamata Class.forName.

Sono su Java 8.

Cosa mi manca?

AGGIORNAMENTO: Ho appena provato un programma a riga di comando e funziona senza lo forName. Tuttavia, dal mio IDE Eclipse in cui sto eseguendo il mio servizio REST come server Tomcat 8.0 su localhost, non funziona.

+1

* "... sqljdbc42.jar che è 4.0 driver" * [Prova qui] (https://msdn.microsoft.com/en-us/library/ms378422 (v = sql.110) .aspx), per tutti gli altri scettici. :-) Beh, ok, non è un driver 4.0, è un driver 4.2, ma ... –

+1

@TJCrowder aggiornato :-) – user93353

+1

Se così sembra che Microsoft non ami seguire gli standard –

risposta

6

I driver vengono inizializzati automaticamente quando la classe DriverManager viene inizializzata automaticamente tramite SPI (Interfaccia provider di servizi). Ciò significa che internamente cercherà di trovare qualsiasi file META-INF/services/java.sql.Driver disponibile nel caricatore di classe di contesto e per ogni file trovato creerà un'istanza della classe definita nel file che in questo caso è in realtà il FQN del driver JDBC , questo è il modo in cui i driver JDBC vengono inizializzati automaticamente a partire da JDBC 4.0.

Ma questo può funzionare solo se il driver è disponibile dal loader della classe di contesto durante l'inizializzazione della classe DriverManager. Un buon modo per garantire che è quello di rendere il driver disponibile da un Class Loader sufficientemente alto nella gerarchia. Nel tuo caso dovresti inserire il driver in tomcat/lib. In effetti, in questo modo il tuo autista sarà disponibile dal Common CL che dovrebbe essere abbastanza alto. Ulteriori dettagli sulla gerarchia CL in Tomcat here.

Problemi correlati