2012-04-06 15 views
7

Dopo aver chiuso una connessione al database in java, posso riaprirlo? O devo ancora fare DriverManager.getConnection()?Riapri connessione al database in Java

+4

Cosa c'è di così difficile da provare? –

+0

Vedete anche qualche metodo aperto su Connection? – MrJames

+0

Non vedo alcun metodo aperto in connessione. Quindi come lo provo? Chiamare 'getConnection' funzionerà, provato, ma è il modo" corretto "? –

risposta

4

Non sono sicuro al 100% che tu sia il necessario chiamare DriverManager.getConnection() ma qual è il danno? Hai già chiuso la connessione, prendine una nuova quando ne hai bisogno. Il garbage collector si preoccupa di quella connessione chiusa dopo averla scartata.

1

sì, non si può fare nulla dopo aver chiuso la connessione. devi chiamare getConnection

0

Come Javadoc menzioni:

getConnection: Attempts to establish a connection to the given database URL. 

Pertanto sì, chiamando getConnection() si presenta ancora una volta come l'unico modo per stabilire una nuova connessione con il database una volta che hai chiuso la connessione precedente.

7

Se si è chiamato connection.close();, il connection (supponendo il tipo java.sql.Connection) diventa inutile. Questa operazione rilascia il database di questo oggetto Connection e le risorse JDBC.

Così è necessario per ottenere una connessione fresca quando prima di poter procedere

connection = DriverManager.getConnection() 
+0

Ho appena iniziato a fare connessioni JDBC a SQL Server dopo aver fatto tutto in C# e il ragazzo è stato un grande mistero per metà della mia giornata di ieri. – JoeManiaci

0

Beh Idealmente ho fatto approccio leggermente diverso e ha dato una soluzione diversa.

Invece di aprire e chiudere il database, che si verificava letteralmente su ogni richiesta del client, ho creato un'istanza singleton di una classe e creato una singola connessione aperta che verrà riutilizzata finché il processo del server è attivo.

In breve:

Ho getConnection() all'interno Database classe

public Connection getConnection() throws Exception { 
    try { 
     String connectionURL = "jdbc:mysql://localhost:3306/someDatabase"; 
     Class.forName("com.mysql.jdbc.Driver").newInstance(); 
     if (connection == null) { 
      connection = DriverManager.getConnection(connectionURL, "someUser", LOCAL_MYSQL_PASSWORD); 
     } 

     return connection; 
    } catch (Exception e) { 
    } 

} 

La classe Database è singoletto, quindi riutilizzando la stessa classe e riutilizzare la stessa connessione.

Ho provato questo da show processList e questo stava dando circa 100 connessioni Se non chiuderò la connessione, e anche se chiudo la connessione, il processo effettivo non sarà probabilmente ucciso, ma messo in sospensione invece sarà usato ogni volta che lo stesso cliente chiederà la stessa richiesta, ma se hai richieste come 15, allora ognuna di esse avrà processi separati, quindi la chiusura e l'apertura della connessione per me non era la soluzione migliore.

Con questo ho 1 singolo processo che è il livello responsabile per le query.

Problemi correlati