Visualizzazione dei risultati da 1 a 8 su 8

Discussione: Tomcat e Postgresql

  1. #1

    Tomcat e Postgresql

    Salve,

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

    codice:
    "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

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

    Uso maven, per importare la libreria postgresql

    codice:
    <!-- 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

    codice:
    Class.forName("org.postgresql.Driver");
    
    oppure con

    codice:
    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

    codice:
    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.

    Detto questo, dove sbaglio??

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da psychopathic Visualizza il messaggio
    Detto questo, dove sbaglio??
    Mi vengono in mente due domande:
    - Quale runtime Java stai usando?
    - Stai usando anche un connection pool? (dedurrei di no, se usi DriverManager.getConnection è perché stai usando direttamente JDBC, senza pooling in mezzo).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Mi vengono in mente due domande:
    - Quale runtime Java stai usando?
    - Stai usando anche un connection pool? (dedurrei di no, se usi DriverManager.getConnection è perché stai usando direttamente JDBC, senza pooling in mezzo).
    Ciao,

    Ho risolto impostando la scope della libreria dentro al pom a provided


    codice:
    <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.


    Grazie per l'interesse.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da psychopathic Visualizza il messaggio
    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.
    Non è comunque la soluzione corretta/sensata. Non dovresti mettere jar nella lib di Tomcat se non ci sono motivi ben precisi (perché quelli messi lì diventano "globali" per tutte le webapp).
    Tra l'altro non avrebbe nemmeno molto senso usare Maven se poi tanto devi andare a copiare a manina le dipendenze altrove.

    Piuttosto mi viene un dubbio .. un sospetto più che altro. Come stai facendo il build/deploy della webapp? Da un IDE? Da prompt? E soprattutto, cosa hai messo come <packaging> nel pom.xml ?
    Perché se hai messo <packaging>jar</packaging> o non l'hai messo proprio (che equivale a specificare jar), allora questo è il problema ed errore.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da psychopathic Visualizza il messaggio
    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.
    Non è comunque la soluzione corretta/sensata. Non dovresti mettere jar nella lib di Tomcat se non ci sono motivi ben precisi (perché quelli messi lì diventano "globali" per tutte le webapp).
    Tra l'altro non avrebbe nemmeno molto senso usare Maven se poi tanto devi andare a copiare a manina le dipendenze altrove.

    Piuttosto mi viene un dubbio .. un sospetto più che altro. Come stai facendo il build/deploy della webapp? Da un IDE? Da prompt? E soprattutto, cosa hai messo come <packaging> nel pom.xml ?
    Perché se hai messo <packaging>jar</packaging> o non l'hai messo proprio (che equivale a specificare jar), allora questo è il problema ed errore.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Non è comunque la soluzione corretta/sensata. Non dovresti mettere jar nella lib di Tomcat se non ci sono motivi ben precisi (perché quelli messi lì diventano "globali" per tutte le webapp).
    Tra l'altro non avrebbe nemmeno molto senso usare Maven se poi tanto devi andare a copiare a manina le dipendenze altrove.

    Piuttosto mi viene un dubbio .. un sospetto più che altro. Come stai facendo il build/deploy della webapp? Da un IDE? Da prompt? E soprattutto, cosa hai messo come <packaging> nel pom.xml ?
    Perché se hai messo <packaging>jar</packaging> o non l'hai messo proprio (che equivale a specificare jar), allora questo è il problema ed errore.

    Buongiorno,

    Uso IntelliJ come ide, e questo è il mio pom

    codice:
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>sfm</groupId>
        <artifactId>sfm</artifactId>
        <packaging>war</packaging>
        <version>1.0-SNAPSHOT</version>
        <name>sfm Maven Webapp</name>
        <url>http://maven.apache.org</url>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <maven.compiler.source>21</maven.compiler.source>
            <maven.compiler.target>21</maven.compiler.target>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>3.8.1</version>
                <scope>test</scope>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/org.glassfish.jersey.bundles/jaxrs-ri -->
    <dependency>
                <groupId>org.glassfish.jersey.bundles</groupId>
                <artifactId>jaxrs-ri</artifactId>
                <version>3.1.10</version>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/jakarta.platform/jakarta.jakartaee-web-api -->
    <dependency>
                <groupId>jakarta.platform</groupId>
                <artifactId>jakarta.jakartaee-web-api</artifactId>
                <version>11.0.0</version>
                <scope>provided</scope>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/org.postgresql/postgresql -->
    <dependency>
                <groupId>org.postgresql</groupId>
                <artifactId>postgresql</artifactId>
                <version>42.7.5</version>
                <scope>provided</scope>
    </dependency>
    
            <!-- https://mvnrepository.com/artifact/com.sun.xml.bind/jaxb-impl  
    <dependency>
                <groupId>com.sun.xml.bind</groupId>
                <artifactId>jaxb-impl</artifactId>
                <version>4.0.5</version>
            </dependency>
    
    </dependencies>
    
        <build>
            <finalName>sfm</finalName>
        </build>
    </project>
    Si sono a conoscenza che le librerie mese nella cartella tomcat/lib sono "shared" con tutte le applicazioni caricate sul server.
    Condivido sul fatto di utilizzare maven e poi andare a posizionare manualmente la libreria non è "sensato". Anche se spero che sia un caso isolato questo di tomcat.

    Resto in tua attesa. Grazie

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da psychopathic Visualizza il messaggio
    Uso IntelliJ come ide, e questo è il mio pom
    Ok, il pom in effetti è corretto.

    Lo scope provided è ok per jakarta.jakartaee-web-api. Tira dentro molte cose (è una dipendenza di "piattaforma" intera) ma sono tutte provided, quindi usate solo in compilazione.

    Per il postgresql invece lo scope provided è scorretto. Se proprio vuoi mettere lo scope, al massimo dovrebbe essere <scope>runtime</scope> che ha anche più senso (i driver JDBC di norma non servono in compilazione ma solo a runtime).

    Pertanto, fai questa correzione (e togli il jar dalla c:\tomcat-10.1.40\lib !). Quindi lancia un mvn package (da prompt o l'equivalente da IDE). Ti crea il war e se ci guardi dentro, dovresti trovare la WEB-INF/lib/ con svariati jar, tra cui anche il postgresql-42.7.5.jar.

    Se c'è e fai il deploy del war, funziona? Se sì, stop, il problema non c'è o perlmeno non è a questi livelli ma forse altrove.

    L'unica cosa che non hai descritto bene è come fai il deploy. Dall'IDE? Se ben ricordo (ed è ancora così), l'IntelliJ community non ha il supporto nativo di Tomcat mentre quello commerciale ha già tutte le integrazioni per i server.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Ok, il pom in effetti è corretto.

    Lo scope provided è ok per jakarta.jakartaee-web-api. Tira dentro molte cose (è una dipendenza di "piattaforma" intera) ma sono tutte provided, quindi usate solo in compilazione.

    Per il postgresql invece lo scope provided è scorretto. Se proprio vuoi mettere lo scope, al massimo dovrebbe essere <scope>runtime</scope> che ha anche più senso (i driver JDBC di norma non servono in compilazione ma solo a runtime).

    Pertanto, fai questa correzione (e togli il jar dalla c:\tomcat-10.1.40\lib !). Quindi lancia un mvn package (da prompt o l'equivalente da IDE). Ti crea il war e se ci guardi dentro, dovresti trovare la WEB-INF/lib/ con svariati jar, tra cui anche il postgresql-42.7.5.jar.

    Se c'è e fai il deploy del war, funziona? Se sì, stop, il problema non c'è o perlmeno non è a questi livelli ma forse altrove.

    L'unica cosa che non hai descritto bene è come fai il deploy. Dall'IDE? Se ben ricordo (ed è ancora così), l'IntelliJ community non ha il supporto nativo di Tomcat mentre quello commerciale ha già tutte le integrazioni per i server.
    Ciao, domani farò una prova, ma il problema è proprio quando la libreria la mette dentro WEB-INF/lib/. Quando la libreria di postgresql è qui dentro non viene caricata/registrata. mentre le la sposto dentro tomcat/lib, viene correttamente caricata/registrata e alla chiusura dell'app viene deregistrata correttamente.

    Per il deploy, con intellj creo il file war, poi lo carico con tomcat ed eseguo il deploy dalla schermata manager di tomcat.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.