Come posso utilizzare un oggetto di connessione al database in tutta l'applicazione? [duplicato]
Questa domanda ha già una risposta qui:
Ho creato questa classe che restituisce oggetto di connessione. Ho usato il database MySQL.
public class Connect_db {
public Connection getConnection(String db_name,String user_name,String password)
{
Connection con=null;
try
{
Class.forName("com.mysql.jdbc.Driver");
con=DriverManager.getConnection("jdbc:mysql://localhost/"+db_name+"?user="+user_name+"&password="+password);
}
catch(Exception e)
{
e.printStackTrace();
}
return con;
}
}
Ora tutto quello che voglio fare è istanziare questa classe una volta e ottenere l'oggetto di connessione. E voglio usare questo stesso oggetto in tutta l'applicazione. Un'altra soluzione sarà anche apprezzata.
3 answers
Suppongo che tu abbia bisogno di un modello singleton, ecco un esempio rapido:
public class Connect_db {
static Connection con=null;
public static Connection getConnection()
{
if (con != null) return con;
// get db, user, pass from settings file
return getConnection(db, user, pass);
}
private static Connection getConnection(String db_name,String user_name,String password)
{
try
{
Class.forName("com.mysql.jdbc.Driver");
con=DriverManager.getConnection("jdbc:mysql://localhost/"+db_name+"?user="+user_name+"&password="+password);
}
catch(Exception e)
{
e.printStackTrace();
}
return con;
}
}
Allora sarai in grado di usare la connessione in questo modo:
Connect_db.getConnection().somemethods();
Ma, dovresti pensare - come funzionerà in un ambiente multi-thread, quando diversi thread stanno cercando di effettuare richieste al database.
Modo molto primitivo, è possibile ottenere un'istanza di connessione da
Connect_db.getConnection (dbName, userName, passwd);
In qualsiasi classe perché è un metodo statico.
public class Connect_db {
static {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
throw new IllegalArgumentException("MySQL db driver isnot on classpath");
}
}
public static Connection getConnection(String db_name,String user_name,String password) throws SQLException
{
return DriverManager.getConnection("jdbc:mysql://localhost/"+db_name+"?user="+user_name+"&password="+password);
}
}
Se il tuo applicaiton è mutlithreaded e dovrebbe funzionare bene usa un pool
Mi è piaciuta molto la risposta di Lashane, ho usato il codice per creare una soluzione DataSource
. L'ho anche ridisegnato per memorizzare solo DataSource
e non Connection
, nel caso in cui tu voglia aprirne più.
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
public class SignalDB {
private static MysqlDataSource ds = null;
public static MysqlDataSource getDataSource(String db_name) {
if (ds == null) {
// db variables set here
getDataSource(db_url, db_user, db_password, db_port);
}
ds.setDatabaseName(db_name);
return ds;
}
private static void getDataSource(String db_url, String db_user, String db_password, int db_port) {
try {
ds = new MysqlDataSource();
ds.setServerName(db_url);
ds.setUser(db_user);
ds.setPassword(db_password);
ds.setPort(db_port);
} catch (Exception e) {
System.out.println("MysqlDataSource err: " + e.getMessage());
e.printStackTrace();
}
}
}
Quindi è possibile creare connessioni utilizzando:
con = SignalDB.getDataSource("database_name").getConnection();
Ho aggiunto la possibilità di connettersi a un database diverso ogni volta, in alcuni casi, come il nostro, è quello che devi fare al volo.
Spero che questo aiuti.