Tiempo de espera de conexión para DriverManager getConnection

Estoy tratando de conectarme a DB usando la forma estándar de JDBC

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

¿Existe un valor máximo de tiempo de espera en la conexión, cuánto tiempo dura una conexión, puedo boost el valor? Quiero que, en los casos en que la conexión esté abierta para siempre, sea una buena idea.

El valor generalmente es controlado por DB. Usted no tiene control sobre el uso del código. Depende del servidor de base de datos utilizado. Por lo general, es de alrededor de 30 minutos hasta una hora.

Por otro lado, mantener una Connection abierta para siempre es una muy mala idea. La mejor práctica es adquirir y cerrar Connection , Statement y ResultSet en el ámbito más breve posible para evitar fugas de recursos y posibles lockings de aplicaciones causados ​​por fugas y tiempos de espera.

Es cierto que conectar el DB es una tarea costosa. Si su aplicación se supone que debe ejecutarse durante un tiempo relativamente largo y para conectar el DB con bastante frecuencia, entonces considere usar un grupo de conexiones para mejorar el rendimiento de la conexión. Si su aplicación es una aplicación web, eche un vistazo a la documentación del servidor de aplicaciones, por lo general, proporciona una función de agrupación de conexiones en el sabor de un DataSource . Si se trata de una aplicación cliente, busque bibliotecas de agrupación de conexiones de terceros que hayan demostrado su robustez con años, como Apache Commons DBCP (comúnmente utilizado, utilizado en servidores de aplicaciones de lotes), C3P0 (conocido de Hibernate) y Proxool (si lo desea) Conexiones XA).

Tenga en cuenta que, al utilizar un grupo de conexiones, aún debe escribir el código JDBC adecuado, por ejemplo, adquirir y cerrar todos los recursos en el ámbito más breve posible. A su vez, el grupo de conexiones se preocupará por cerrar la conexión o simplemente volver a soltarla para volver a usarla.

Puede obtener más información de este artículo sobre cómo hacer los principios básicos de JDBC de la manera adecuada.

Espero que esto ayude y una encoding feliz.

Puede establecer el tiempo de espera en el DriverManager de esta manera:

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

Lo que implicaría que si la conexión no se puede abrir dentro del tiempo dado, se agota el tiempo.

En términos de mantener una conexión abierta para siempre, es posible si no cierra la conexión, pero puede que no sea una buena idea. Las conexiones deben cerrarse tan pronto como haya terminado con ellas.

Si desea optimizar la apertura y el cierre de las conexiones, puede usar un grupo de conexiones.

Simplemente volviendo a publicar un comentario más completo de un usuario flamming_python como respuesta porque me funcionó:

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

Comentario original:
“LoL @ tus hilos: puedes hacerlo simplemente creando un objeto Propiedades prop, luego prop.put (” connectTimeout “,” 2000 “) (donde el” 2000 “es el tiempo de espera en ms), y luego pasa tu prop objetar el método DriverManager.getConnection () junto con su url ”

Aquí es cómo hacerlo con el controlador Connector / J MYSQL:

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

Me funcionó después de que setLoginTimeout() no hiciera nada.

Como lo sugirió Bestro, es posible usar un futuro con un tiempo de espera asociado. Por ejemplo:

 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!"); } 

Puede usar la interfaz ExecutorService de Java. A continuación hay una muestra de lo que debe hacer.

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