Carissimi,
dietro insistente consiglio di diverse persone sto trasferendo i databade delle mie web application da MySql a PostgreSql; l'esportazione db da un formato all'altro, con alcuni tool, è riuscita perfettamente. Ho anche correttamente caricato il driver nell'applicazione. Ora come posso modificare la seguente classe di connessione per adattarla al nuovo sistema? Grazie a tutti!
public boolean connetti() {
connesso = false;
try {
// Carico il driver JDBC per la connessione con il database MySQL
Class.forName("com.mysql.jdbc.Driver");
// Controllo che il nome del Database non sia nulla
if (!nomeDB.equals("")) {
// Controllo se il nome utente va usato o meno per la connessione
if (nomeUtente.equals("")) {
// La connessione non richiede nome utente e password
db = DriverManager.getConnection("jdbc:mysql://localhost/" + nomeDB);
} else {
// La connessione richiede nome utente, controllo se necessita anche della password
if (pwdUtente.equals("")) {
// La connessione non necessita di password
db = DriverManager.getConnection("jdbc:mysql://localhost/" + nomeDB + "?user=" + nomeUtente);
} else {
// La connessione necessita della password
db = DriverManager.getConnection("jdbc:mysql://localhost/" + nomeDB + "?user=" + nomeUtente + "&password=" + pwdUtente);
}
}
// La connessione è avvenuta con successo
connesso = true;
} else {
System.out.println("Manca il nome del database");
System.out.println("Scrivere il nome del database da utilizzare all'interno del file \"config.xml\"");
System.exit(0);
}
} catch (Exception e) { errore = e.getMessage(); }
return connesso;
}
Ultima modifica di Archimede Pitagorico il giovedì 1 maggio 2008, 10:22, modificato 1 volta in totale.
occhio che fare una select o una insert su postgres e mysql non è propriamente uguale. Non basta solo modificare la connessione. Ad esempio su postgres la tabella con il nome USER non la puoi utilizzare, su postgres sono previste le sequences mentre su mysql ci sono i campi con autoincremento, etc etc. E' per questo motivo che la parte che si preoccupa di accedere al db deve essere isolata dal resto, avere i parametri per la connessione esterni (context.xml) e non scolpiti al suo interno, avere una interfaccia pubblica, o roba simile, che accetta parametri dal lato web e richiama una classe specifica per accedere al db in uso e ritorna i dati in una classe di comunicazione web/db. Allora sì che è solo aprire una connessione con uno o l'altro db.....
Poi anche lato server le procedure o le function sono diverse e devono essere riscritte.
Comunque nel zip dei driver postgres trovi esempi di connessione.
Per il resto anche secondo me con java/j2ee è più performante postgres ed è più database rispetto a mysql, senza togliere nulla a quest'ultimo!!!!!e poi occupa molta meno ram rispetto a mysql (io ho solo 512 di ram...) e ti rendi conto il numero di connessioni che apri e lasci aperte (almeno sotto linux, non so sotto windows). Che script hai usato per la conversione? io uso uno script scritto in perl e funziona abbastanza bene.
ciao
prampa ha scritto:
occhio che fare una select o una insert su postgres e mysql non è propriamente uguale. Non basta solo modificare la connessione. Ad esempio su postgres la tabella con il nome USER non la puoi utilizzare, su postgres sono previste le sequences mentre su mysql ci sono i campi con autoincremento, etc etc. E' per questo motivo che la parte che si preoccupa di accedere al db deve essere isolata dal resto, avere i parametri per la connessione esterni (context.xml) e non scolpiti al suo interno, avere una interfaccia pubblica, o roba simile, che accetta parametri dal lato web e richiama una classe specifica per accedere al db in uso e ritorna i dati in una classe di comunicazione web/db. Allora sì che è solo aprire una connessione con uno o l'altro db.....
Poi anche lato server le procedure o le function sono diverse e devono essere riscritte.
Dio benedica Hibernate (rotfl)
prampa ha scritto:
Per il resto anche secondo me con java/j2ee è più performante postgres ed è più database rispetto a mysql, senza togliere nulla a quest'ultimo!!!!!e poi occupa molta meno ram rispetto a mysql (io ho solo 512 di ram...) e ti rendi conto il numero di connessioni che apri e lasci aperte (almeno sotto linux, non so sotto windows).
Chissà se dopo l'acquisizione da parte di Sun mysql farà un bel salto....
Citato da: prampa su 27 Aprile, 2008, 21:23:05
occhio che fare una select o una insert su postgres e mysql non è propriamente uguale. Non basta solo modificare la connessione. Ad esempio su postgres la tabella con il nome USER non la puoi utilizzare, su postgres sono previste le sequences mentre su mysql ci sono i campi con autoincremento, etc etc. E' per questo motivo che la parte che si preoccupa di accedere al db deve essere isolata dal resto, avere i parametri per la connessione esterni (context.xml) e non scolpiti al suo interno, avere una interfaccia pubblica, o roba simile, che accetta parametri dal lato web e richiama una classe specifica per accedere al db in uso e ritorna i dati in una classe di comunicazione web/db. Allora sì che è solo aprire una connessione con uno o l'altro db.....
Poi anche lato server le procedure o le function sono diverse e devono essere riscritte.
Dio benedica Hibernate
concordo.....
Citato da: prampa su 27 Aprile, 2008, 21:23:05
Per il resto anche secondo me con java/j2ee è più performante postgres ed è più database rispetto a mysql, senza togliere nulla a quest'ultimo!!!!!e poi occupa molta meno ram rispetto a mysql (io ho solo 512 di ram...) e ti rendi conto il numero di connessioni che apri e lasci aperte (almeno sotto linux, non so sotto windows).
Chissà se dopo l'acquisizione da parte di Sun mysql farà un bel salto....
chissa', potenzialità ce ne sono molte....non ho ancora pero' capito dove la Sun voglia arrivare....
Ultima modifica di prampa il lunedì 28 aprile 2008, 9:21, modificato 1 volta in totale.
Ho qualche dubbio, teoricamente concordo, ma nella pratica ci sono ancora problemini.
perche'? io con hibernate mi trovo benissimo... (anche se preferisco le linq di .net 3.5. Spero presto faranno qualcosa anche in JAVA)
r.
http://blog.spicydev.it
"Chi riceve un'idea da me, ricava conoscenza senza diminuire la mia; come chi accende la sua candela con la mia, riceve luce senza lasciarmi
al buio". - Thomas Jefferson
Su Hibernate mi sono messo da poco, diciamo problemi collaterali che in fase di sviluppo danno da pensare e mi lasciano perplesso dato che chiaramente quando mi metto per fare un sistema desidero che sia stabile.
Es. se tenti di usare le annotazioni in hibernate, essendo quella parte in beta, non saprei se vale la pena oppure meglio continuare ad aspettare.
Se usi hibernate insieme a tomcat spunta il mitico errore permgen (io uso netbeans ma pure chi usa eclipse nota questo problema), il problema pare sia in realtà di java (non ha importanza avere la versione), fatto sta che emerge quando si combina insieme hibernate+tomcat.
Questo problema si presenta soprattutto durante la fase di sviluppo però è lo stesso una bella seccatura.
Sono tutte queste cose, prese nel loro insieme, che mi lasciano perplesso.
AlexSistemiFree ha scritto:
Su Hibernate mi sono messo da poco, diciamo problemi collaterali che in fase di sviluppo danno da pensare e mi lasciano perplesso dato che chiaramente quando mi metto per fare un sistema desidero che sia stabile.
Es. se tenti di usare le annotazioni in hibernate, essendo quella parte in beta, non saprei se vale la pena oppure meglio continuare ad aspettare.
Se usi hibernate insieme a tomcat spunta il mitico errore permgen (io uso netbeans ma pure chi usa eclipse nota questo problema), il problema pare sia in realtà di java (non ha importanza avere la versione), fatto sta che emerge quando si combina insieme hibernate+tomcat.
Questo problema si presenta soprattutto durante la fase di sviluppo però è lo stesso una bella seccatura.
Sono tutte queste cose, prese nel loro insieme, che mi lasciano perplesso.
Beh, considerando che hibernate è uno dei framework più utilizzati nel mondo java (anche se, naturalmente, non può essere considerato perfetto), secondo me ti preoccupi un po' troppo (good)
Aiuto, che cosa ho creato? Ho modificato la classe di connessione come da vostre inidcazioni ma vedo il terribilissimo errore null pointer exception che tante ore ha sottratto al mio sonno! Eppure query & c nella mia applicazione sono davvero semplici, dubito possano essere la causa di quella orrenda scritta. Per completezza vi copio tutto sotto. Vi prego, fate che io non mi penta della scelta di Postgre visto che tutti me ne hanno parlato benissimo!
Ecco la classe di connessione modificata come da vostre dritte:
public DAOManager(String nomeDB, String nomeUtente, String pwdUtente) {
this.nomeDB = nomeDB;
this.nomeUtente = nomeUtente;
this.pwdUtente = pwdUtente;
connesso = false;
errore = "";
}
// Apre la connessione con il Database
public boolean connetti() {
connesso = false;
try {
// Carico il driver JDBC per la connessione con il database MySQL
Class.forName("org.postgresql.Driver");
// Controllo che il nome del Database non sia nulla
if (!nomeDB.equals("")) {
// Controllo se il nome utente va usato o meno per la connessione
if (nomeUtente.equals("")) {
// La connessione non richiede nome utente e password
db = DriverManager.getConnection("jdbc:postgresql://localhost/" + nomeDB);
} else {
// La connessione richiede nome utente, controllo se necessita anche della password
if (pwdUtente.equals("")) {
// La connessione non necessita di password
db = DriverManager.getConnection("jdbc:postgresql://localhost/" + nomeDB + "?user=" + nomeUtente);
} else {
// La connessione necessita della password
db = DriverManager.getConnection("jdbc:postgresql://localhost/" + nomeDB + "?user=" + nomeUtente + "&password=" + pwdUtente);
}
}
// La connessione è avvenuta con successo
connesso = true;
} else {
System.out.println("Manca il nome del database");
System.out.println("Scrivere il nome del database da utilizzare all'interno del file \"config.xml\"");
System.exit(0);
}
} catch (Exception e) { errore = e.getMessage(); }
return connesso;
}
Ed eccovi un esempio di query presa da una classe business che genera quell'errore:
Immagino il problema sia sulla tabella tbl_user che magari non esiste, ti è già stato accennato alcune differenze esistenti tra i database.
Nota:
Per il discorso hibernate, si alla fine lo userò, poi chissà che non chieda qui, mi rompe registrarmi al loro forum, se la tirano un po' con il discorso dei crediti ...
Scusa, mi sfugge l'attinenza tra l'errore che ho trovato ed il fatto che mi erano state accennate differenze tra i db... Ho importato le strutture dei db ed anche i dati con un tool che ha funzionato senza fare una piega (db convert) e poi io stesso ho verificato tabella per tabella l'integrità di struttura e dati...
Ragazzi siete la mia salvezza. Prampa i driver sono stati copiati, sotto forma di jar, in lib sotto web inf esattamente come avevo fatto per i driver di mysql tant'è che poi compaiono correttamente tra le librerie dell'applicazione. Riguardo poi la modifica alla porta del localhost, dove dovrei inserirla? Ma poi quel numero di porta funzionerà anche in remoto? Vabbé provo subito e vi dico. Cosa non farei senza di voi.
NO! Anche inserendo quel numero su localhost vedo ancora quell'errore, tipico di quando ai tempi di mysql il db non era visto. Cosa ho fatto di male stavolta? Non ho altro codice oltre a quello che vi ho postato! Dove può essere lo sbaglio?