Ho configurato su Ubuntu un server con Tomcat e PostgreSQL usando DockerCompose che non funziona e non riesco a capire se il problema è legato alla mia webapp in Java oppure a DockerCompose.
La mia webapp se testata con DockerCompose su Windows 10 funziona quindi penso sia un problema di DockerCompose ma ho qualche dubbio.
Il problema è in questa classe:
public Connection connect() {
try {
DBMS db = this.dbms;
String url;
String user;
String password;
Connection conn;
try {
url = db.getUrl();
user = db.getUser();
password = db.getPassword();
conn = DriverManager.getConnection(url, user, password);
} catch(Exception e) {
db = DBMSConnessione();
url = db.getUrl();
user = db.getUser();
password = db.getPassword();
// url = "jdbc:postgresql://localhost:5432/gis";
// user = "eb";
// password = "password";
conn = DriverManager.getConnection(url, user, password);
// Quando Java cerca di creare l'oggetto "conn" il server va in errore.
}
System.out.println("Connesso al server PostgreSQL con successo.");
return conn;
} catch (Exception e) {
throw new DBMSEccezione("Impossibile connettersi al server PostgreSQL.", e);
}
}
Il punto in cui la webapp si blocca è qui:
conn = DriverManager.getConnection(url, user, password);
La cosa strana è che JDBC non si connette e per giunta senza errori.
Il codice di risposta che ottengo è "500 Internal Server Error" che indica che il server ha riscontrato una condizione imprevista, che gli ha impedito di andare avanti.
Sembrerebbe un problema di server e quindi di DockerCompose ma c’è una cosa che non vi ho detto. Se mi connetto, sempre da Ubuntu, con SQuirreL SQL Client usando il driver JDBC ed usando le credenziali date in pasto alla classe ovvero:
url = "jdbc:postgresql://localhost:5432/gis";
user = "eb";
password = "password";
mi connetto senza problemi e riesco anche ad inviare delle query.
Va detto che SQuirreL SQL Client è installato direttamente su Ubuntu mentre la mia webapp viene salvata in un container Tomcat che comunica a sua volta con un altro container PostgreSQL. Per questo motivo penso che sia un problema di configurazione di rete e che la mia webapp sia perfetta.
Resto comunque deluso per non riuscire a leggere questa eccezione sulla shell:
try{
conn = DriverManager.getConnection(url, user, password);
}catch(Exception g){
throw g;
}
e neppure questa:
try{
conn = DriverManager.getConnection(url, user, password);
}catch(Exception g){
throw new DBMSEccezione("Impossibile connettersi al server PostgreSQL.", g);
}
né tantomeno quella generale:
} catch (Exception e) {
throw new DBMSEccezione("Impossibile connettersi al server PostgreSQL.", e);
}
In pratica ho aggiunto delle eccezioni che non mi servono a nulla.
L’unica soluzione che funziona è questa:
try{
conn = DriverManager.getConnection(url, user, password);
}catch(Exception g){
System.out.println("Impossibile connettersi al server PostgreSQL.");
throw new DBMSEccezione("Impossibile connettersi al server PostgreSQL.", e);
}
Non so se la mia soluzione è prudente e formalmente buona oppure no ma non ho trovato altre strategie.
Ho anche letto qui:
https://www.slacky.eu/forum/viewtopic.php?t=3663
ma non mi ha aiutato molto perché DockerCompose non da la possibilità di intervenire sulla configurazione del server.
La mia classe eccezione è questa:
public class DBMSEccezione extends RuntimeException {
public DBMSEccezione(String message, Throwable cause) {
super(message, cause);
}
public DBMSEccezione(String message) {
super(message);
}
public DBMSEccezione(Throwable cause) {
super(cause);
}
}