Tomcat registrazione driver postgresql

di il
10 risposte

Tomcat registrazione driver postgresql

Salve,

nella mia web application, con Tomcat quando tento di connettermi a postgresql ricevo sempre l'errore


"No suitable driver found for jdbc:postgresql://localhost:5432/..."


Il codice che uso per connettermi, se provato in locale va benissimo, mentre mi da problemi quando provo su tomcat.

Quindi la stringa di connessione è corretta.

Questo è il codice che uso per connettermi

Connection conn = null;
PreparedStatement parametersStatement = null;
ResultSet rSet = null;
conn = DriverManager.getConnection(strConn);

Uso maven, per importare la libreria postgresql

<!-- https://mvnrepository.com/artifact/org.postgresql/postgresql -->
<dependency>
 <groupId>org.postgresql</groupId>
 <artifactId>postgresql</artifactId>
 <version>42.7.5</version>
</dependency>

Da quello che ho capito non riesce a "caricare/registrare" il driver. Cosa che dovrebbe fare automaticamente in questo punto DriverManager.getConnection(strConn); come ripostato dalla documentazione ufficiale di postgresql    https://jdbc.postgresql.org/documentation/use/

"Applications do not need to explicitly load the org.postgresql.Driver class because the pgJDBC driver jar supports the Java Service Provider mechanism. The driver will be loaded by the JVM when the application connects to PostgreSQL® (as long as the driver’s jar file is on the classpath)."

Su tomcat nella cartella WEB-INF\lib è presente il driver ma non capisco perche fallisce la registrazione.

Se forzo la registrazione/caricamente del driver con


Class.forName("org.postgresql.Driver");

oppure con


DriverManager.registerDriver(new org.postgresql.Driver ());


Risolvo il problema di connessione ma ne sorge un'altro.
Tomcat inizia a spammare nella console un messaggio di warning, ovvero


WARNING [main] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc The web application [appname] registered the JDBC driver [org.postgresql.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.

Evidentemente non è la soluzione giusta quella di forzare la registrazione del driver.

Se copio manualmente il driver di postgresql nella cartella di tomcat/lib, la connessione avviene ma solo dopo che ho refreshato la pagina ma nella console di tomcat ho sempre il messaggio di warning.

Detto questo, dove sbaglio??

Ringrazio anticipatamente per l'aiuto.

10 Risposte

  • Re: Tomcat registrazione driver postgresql

    Non è simpatico scrivere su tutti i forum contemporaneamente...

    https://forum.html.it/forum/showthread.php?threadid=2979556&postid=25583863#post25583863

  • Re: Tomcat registrazione driver postgresql

    Ciao,

    da una veloce ricerca... hai provato in questo modo ?

    DataSource ds = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/MyDb");
    Connection conn = ds.getConnection();
    
  • Re: Tomcat registrazione driver postgresql

    27/04/2025 - oregon ha scritto:

    Non è simpatico scrivere su tutti i forum contemporaneamente...

    https://forum.html.it/forum/showthread.php?threadid=2979556&postid=25583863#post25583863

    Ops... non mi ero accorto del crossposting

  • Re: Tomcat registrazione driver postgresql

    27/04/2025 - oregon ha scritto:

    Non è simpatico scrivere su tutti i forum contemporaneamente...

    https://forum.html.it/forum/showthread.php?threadid=2979556&postid=25583863#post25583863

    Ed è una regola che ho sempre seguito dai tempi di MasterDrive. Su Html, cerano ben 2 miei post duplicati che non so per quale motivo/problema del sito, che al momento dell'invio della discussione, mi dava sempre errore e non mi ha più ricaricato la pagina/sito. Ho dato per scontato che non fossi riuscito a creare la discussione e cosi ho deciso di scrivere qui. 

    Detto questo chiedo scusa, non era mia intenzione.

  • Re: Tomcat registrazione driver postgresql

    27/04/2025 - By65Franco ha scritto:

    Ciao,

    da una veloce ricerca... hai provato in questo modo ?

    DataSource ds = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/MyDb");
    Connection conn = ds.getConnection();
    

    Si ma niente, alla fine ho risolto impostando la scope della libreria dentro al pom a provided

    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>42.7.5</version>
        <scope>provided</scope>  <!-- QUI -->
    </dependency>

    In questo modo la libreria NON viene aggiunta nella cartella ...\WEB-INF\lib

    Poi ho copiato manualmente la libreria nella cartella c:\\tomcat-10.1.40\lib

    Riavviato il tutto e sembra funzionare.

  • Re: Tomcat registrazione driver postgresql

    Ciao, secondo me così è un po' una forzatura poiché perdi il vantaggio principale che ti offre maven cioè non dover importare manualmente le librerie nelle cartelle

    io di solito faccio così quando devo aggiungere delle librerie:

    1-aggiungo la libreria al pom.xml e salvo il file

    2-apro il terminale vado nella root del progetto

    3-digito il comando mvn clean e premo invio

    4-poi digito mvn compile e premo invio

    in questo modo fino ad ora non mi ha mai dato problemi

  • Re: Tomcat registrazione driver postgresql

    30/04/2025 - LucaDev ha scritto:

    Ciao, secondo me così è un po' una forzatura poiché perdi il vantaggio principale che ti offre maven cioè non dover importare manualmente le librerie nelle cartelle

    io di solito faccio così quando devo aggiungere delle librerie:

    1-aggiungo la libreria al pom.xml e salvo il file

    2-apro il terminale vado nella root del progetto

    3-digito il comando mvn clean e premo invio

    4-poi digito mvn compile e premo invio

    in questo modo fino ad ora non mi ha mai dato problemi

    Convengo con te, sul vantaggio di usare maven, ma qui il problema non è maven, dato che lui importa senza problemi la libreria nella cartella \WEB-INF\lib. Ma non so per quale motivo non viene caricat/registrata. Mentre se sposto la libreria manualmente nella cartella tomcat\lib, viene caricata/registrata e poi deregistrata alla chiusura dell'application.

  • Re: Tomcat registrazione driver postgresql

    Mi sa che vi siete un po' impasticciati! :-)

    Tomcat fornisce il servizio di "connection pooling" ai DBMS (MySQL, Postgres, SQLServer etc) a TUTTE le web app.

    Va da se che i  driver JDBC DEVONO essere gestiti da Tomcat e quindi le librerie VANNO messe nella directory [TOMCAT]/lib

    Il fatto di scrivere in Maven 'provided' vuol dire semplicemente che maven NON DEVE scaricare le librerie perche' sono GIA' disponibili 

    Tecnicamente l'applicazione NON DOVREBBE PROPRIO AVERE un riferimento al driver JDBC perche' DOVREBBE USARE il datasource fornito ta Tomcat.

    E' responsabilita' della configurazione dei Datasource di decidere il nome, il tipo di driver da usare e le proprieta' della connessione.

    (E quasi sicuramente e' PROPRIO la NON NECESSITA dei driver a far si che 'provided' funziona: i driver NON SERVONO e quindi il fatto che non ci siano non ha NESSUN EFFETTO)

    ALTRO DISCORSO SE la gestione della connessione e' fatta DIRETTAMENTE dalla web app. 

    In questo caso la libreria DEVE essere fornita alla web-app (nella SUA directory lib) e la gestione della connessione (e del connection pooling) e' SUA responsabilita'.

    .

    QUello che ha scritto @LucaDev e' corretto M, sfortunatamente, non centra niente :-(

  • Re: Tomcat registrazione driver postgresql

    02/05/2025 - migliorabile ha scritto:

    Mi sa che vi siete un po' impasticciati! :-)

    Tomcat fornisce il servizio di "connection pooling" ai DBMS (MySQL, Postgres, SQLServer etc) a TUTTE le web app.

    Va da se che i  driver JDBC DEVONO essere gestiti da Tomcat e quindi le librerie VANNO messe nella directory [TOMCAT]/lib

    Il fatto di scrivere in Maven 'provided' vuol dire semplicemente che maven NON DEVE scaricare le librerie perche' sono GIA' disponibili 

    Tecnicamente l'applicazione NON DOVREBBE PROPRIO AVERE un riferimento al driver JDBC perche' DOVREBBE USARE il datasource fornito ta Tomcat.

    E' responsabilita' della configurazione dei Datasource di decidere il nome, il tipo di driver da usare e le proprieta' della connessione.

    (E quasi sicuramente e' PROPRIO la NON NECESSITA dei driver a far si che 'provided' funziona: i driver NON SERVONO e quindi il fatto che non ci siano non ha NESSUN EFFETTO)

    ALTRO DISCORSO SE la gestione della connessione e' fatta DIRETTAMENTE dalla web app. 

    In questo caso la libreria DEVE essere fornita alla web-app (nella SUA directory lib) e la gestione della connessione (e del connection pooling) e' SUA responsabilita'.

    .

    QUello che ha scritto @LucaDev e' corretto M, sfortunatamente, non centra niente :-(

    La gestione della connessione è fatta direttamente dell'app. Il problema, ripeto, sorge quando la libreria postgresql è inserita nella cartella \WEB-INF\lib, che è dove dovrebbe essere, ma non la carica/registra, e non capisco per quale motivo. Mentre se metto provided, il war non si porta dietro la libreria di postgresql ovvero non viene inserita nella cartella \WEB-INF\lib. Poi provvedo io a copiarla manualmente in [TOMCAT]/lib, e tutto funziona senza ne errori ne warning di memory leak.

  • Re: Tomcat registrazione driver postgresql

    02/05/2025 - migliorabile ha scritto:

    QUello che ha scritto @LucaDev e' corretto M, sfortunatamente, non centra niente :-(

    ah ok :-(

Devi accedere o registrarti per scrivere nel forum
10 risposte