Timeout della connessione per DriverManager getConnection

Sto cercando di connettermi al DB usando il modo standard JDBC

connection = DriverManager.getConnection(url, username, password); 

C’è un valore massimo di timeout sulla connessione, quanto dura una connessione, posso aumentare il valore. Voglio nei casi in cui la connessione sia aperta per sempre, è una buona idea.

Il valore è solitamente controllato da DB. Non hai il controllo su di esso utilizzando il codice. Dipende dal server DB utilizzato. Di solito dura circa 30 minuti fino a un’ora.

D’altra parte, mantenere una Connection aperta per sempre è una pessima idea. La migliore pratica consiste nell’acquisire e chiudere Connection , Statement e ResultSet nel più breve spazio ansible per evitare perdite di risorse e potenziali arresti anomali delle applicazioni causati da perdite e timeout.

È vero, colbind il DB è un compito costoso. Se la tua applicazione dovrebbe funzionare relativamente a lungo e colbind il DB abbastanza spesso, allora considera di utilizzare un pool di connessioni per migliorare le prestazioni di connessione. Se la vostra applicazione è un’applicazione web, date un’occhiata alla documentazione dell’appserver, di solito fornisce una funzionalità di pool di connessioni nel sapore di un DataSource . Se si tratta di un’applicazione client, cerca le librerie di pool di connessioni di terze parti che hanno dimostrato la loro robustezza con anni, come ad esempio Apache Commons DBCP (comunemente usato, usato in appserver), C3P0 (conosciuto da Hibernate) e Proxool (se vuoi Connessioni XA).

Tenere presente che, quando si utilizza un pool di connessioni, è ancora necessario scrivere il codice JDBC corretto, iow acquisisce e chiude tutte le risorse nel più breve ambito ansible. A sua volta, il pool di connessioni si preoccuperà di chiudere effettivamente la connessione o di rilasciarla nuovamente al pool per un ulteriore riutilizzo.

Potresti ottenere ulteriori informazioni da questo articolo su come fare le basi JDBC nel modo giusto.

Spero che questo aiuti e felice codifica.

È ansible impostare il Timeout su DriverManager in questo modo:

  DriverManager.setLoginTimeout(10); Connection c = DriverManager.getConnection(url, username, password); 

Il che implicherebbe che se la connessione non può aprirsi entro il tempo stabilito che scade.

In termini di mantenere una connessione aperta per sempre, è ansible se non si chiude la connessione ma potrebbe non essere una buona idea. I collegamenti dovrebbero essere chiusi non appena hai finito con loro.

Se si desidera ottimizzare l’apertura e la chiusura delle connessioni, è ansible utilizzare un pool di connessioni.

Basta ripubblicare un repost più completo di un commento da parte dell’utente flamming_python come risposta perché ha funzionato per me:

 dbConnectionString = "jdbc:mysql://"+dbHost+":"+dbPort+"/"+dbTable+"?user="+dbUser+"&password="+dbPassword; Properties properties = new Properties(); properties.put("connectTimeout", "2000"); dbConnect = DriverManager.getConnection(dbConnectionString, properties); 

Commento originale:
“LoL @ i tuoi thread – puoi farlo semplicemente creando un object Property prop, quindi prop.put (” connectTimeout “,” 2000 “) (dove” 2000 “è il timeout in ms) e poi passa il tuo prop object al metodo DriverManager.getConnection () insieme al tuo url ”

Ecco come farlo con il driver Connector / J MYSQL:

 String qqq = "jdbc:mysql://localhost/Test?connectTimeout=TIME_IN_MILLIS"; conn = DriverManager.getConnection(qqq, db_user, db_pass); 

Ha funzionato per me dopo setLoginTimeout() non ha fatto nulla.

Come suggerito da Bestro, è ansible utilizzare un futuro con un timeout associato. Per esempio:

 ExecutorService executor = Executors.newSingleThreadExecutor(); Future future = executor.submit(new Callable() { @Override public Connection call() throws Exception { Connection con = DriverManager.getConnection(url, username, password); return con; } }); Connection con = null; try { con = future.get(5, TimeUnit.SECONDS); } catch (InterruptedException | ExecutionException | TimeoutException ex) { Logger.getLogger(Scratch.class.getName()).log(Level.SEVERE, null, ex); } executor.shutdownNow(); if (con == null) { System.out.println("Could not establish connection"); } else { System.out.println("Connection established!"); } 

È ansible utilizzare l’interfaccia ExecutorService da Java. Di seguito è riportato un esempio di ciò che devi fare.

 Future future = executor.submit(YOUR_METHOD); future.get(TIMEOUT_YOU_NEED, TimeUnit.SECONDS);