Ciao
Innanzitutto, volevo farti i complimenti per come scrivi il codice: e' chiaro e pulito.
Avrei qualche suggerimento che mi piacerebbe tu valutassi:
1 - Effettui la connessione al database all'interno di receiveNickname(). Poi, l'oggetto che rappresenta la connessione viene perso all'uscita di questo metodo. Secondo me sarebbe opportuno essere sicuri al 100% che la connessione sia stabilita all'inizio, quindi potresti stabilirla nel costruttore e far diventare l'oggetto conn una variabile membro;
2 - al contrario, crei uno Statement come variabile membro e lo usi un po' dappertutto. Ho visto che lo vai a creare in diversi punti del codice, questo potrebbe causare la perdita di risorse, in particolare quando vai ad aprire un nuovo statement mentre ce n'e' uno gia' aperto.
Il mio suggerimento, anche al fine di evitare effetti collaterali, sarebbe quello di creare un nuovo statement localmente utilizzando la connessione, e poi chiuderlo una volta completato il lavoro.
Per esempio, se usi java 7 o successivi, puoi usare il try-with-resources:
public void addUser(User user) throws SQLException
{
try (Statement st = conn.createStatement())
{
String sql ="insert into Users(nickname,email,password) values('"+user.getUser()+"','"+user.getEmail()+"','"+user.getPassword()+"')";
st.executeUpdate(sql);
}
catch (SQLException e)
{
e.printStackTrace(System.out);
throw(e);
}
}
Cosi' sei sicuro che lo statement e' usato solo qui e per questa query, e non e' riutilizzato da altre parti.
Se utilizzi delle versioni di Java inferiori, non hai a disposizione il try-with-resources e devi prestare un po' piu' attenzione a rilasciare lo statement.
Per esempio, potresti fare:
public void addUser(User user) throws SQLException
{
Statement st = null;
try
{
st = conn.createStatement())
String sql ="insert into Users(nickname,email,password) values('"+user.getUser()+"','"+user.getEmail()+"','"+user.getPassword()+"')";
st.executeUpdate(sql);
}
catch (SQLException e)
{
e.printStackTrace(System.out);
throw(e);
}
finally
{
try
{
if (st != null)
st.close;
}
catch (SQLException e) { }
}
}
Per riassumere: tieni la connessione come variabile membro ed usa statement localmente, assicurandoti di crearli e di chiuderli in ogni caso, anche in caso di eccezione.
Una volta fatte queste modifiche, possiamo controllare ancora gli eventuali errori, avendo pero' la certezza che non dipendono da riutilizzi (o addirittura utilizzi contemporanei) dello stesso statement