¿Cómo administrar conexiones db en el servidor?

Tengo un problema grave con la conexión de mi base de datos en mi aplicación web. Como uso una única conexión de base de datos para toda la aplicación desde la clase Singleton Database, si bash operaciones db simultáneas (dos usuarios), la base de datos reduce las transacciones. Este es mi método estático utilizado:

Todos los subprocesos / servlets llaman a métodos estáticos de Database.doSomething (…), que a su vez llaman al siguiente método.

private static /* synchronized*/ Connection getConnection(final boolean autoCommit) throws SQLException { if (con == null) { con = new MyRegistrationBean().getConnection(); } con.setAutoCommit(true); //TODO return con; } 

¿Cuál es la forma recomendada de gestionar esta / s conexión / es que tengo, para no incurrir en el mismo problema?

Mantener una Connection abierta para siempre es una muy mala idea. No tiene una vida útil infinita, su aplicación puede bloquearse cada vez que la base de datos agote la conexión y la cierre. 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.

Debido a que la conexión de la base de datos es una tarea costosa, debe considerar usar un grupo de conexiones para mejorar el rendimiento de la conexión. Un servidor de aplicaciones decente / servletcontainer normalmente ya proporciona una función de conjunto de conexiones en el sabor de un JNDI DataSource . Consulte su documentación para obtener detalles sobre cómo crearlo. En el caso de, por ejemplo, Tomcat, puede encontrarlo aquí .

Incluso cuando se utiliza un grupo de conexiones, todavía tiene que escribir el código JDBC adecuado: adquirir y cerrar todos los recursos en el ámbito más corto 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. Como una alternativa completamente diferente, aprende EJB y JPA. Se abstraerá toda la plantilla repetitiva de JDBC para ti en oneliners.

Espero que esto ayude.

Ver también:

  • ¿Es seguro usar una instancia java.sql.Connection estática en un sistema multiproceso?
  • ¿Estoy utilizando la agrupación de conexiones JDBC?
  • ¿Cómo debo conectarme a la base de datos / fuente de datos JDBC en una aplicación basada en servlet?
  • ¿Cuándo es necesario o conveniente usar Spring o EJB3 o todos juntos?

No tengo mucha experiencia con PostgreSql, pero todas las aplicaciones web en las que he trabajado han usado una sola conexión por conjunto de acciones en una página, cerrándola y eliminándola cuando haya terminado.

Esto le permite al servidor agrupar conexiones y detener problemas como el que está experimentando.

Singleton debe ser la conexión de grupo JNDI en sí misma; La clase de base de datos con getConnection (), los métodos de consulta y otros NO deberían ser singleton, pero pueden ser estáticos si lo prefieren.

De esta forma, el grupo existe indefinidamente, está disponible para todos los usuarios, mientras que los bloques de consulta usan dataSource.getConnection () para dibujar una conexión desde el grupo; Ejecutar la consulta, y luego cerrar statement, conjunto de resultados y conexión (para devolverlo al grupo).

Además, la búsqueda JNDI es bastante costosa, por lo que tiene sentido usar un singleton en este caso.