¿Alguien puede proporcionar ejemplos o enlaces sobre cómo establecer un grupo de conexiones JDBC?
Al buscar en Google, veo muchas formas diferentes de hacer esto y es bastante confuso.
En última instancia, necesito el código para devolver un java.sql.Connection
objeto, pero tengo problemas para comenzar ... cualquier sugerencia es bienvenida.
Actualización: ¿No tiene implementaciones de conexión agrupadas javax.sql
o no las java.sql
tiene? ¿Por qué no sería mejor usar estos?
Respuestas:
Si necesita un grupo de conexiones independiente, mi preferencia es C3P0 sobre DBCP (que mencioné en esta respuesta anterior ), simplemente tuve demasiados problemas con DBCP bajo carga pesada. Usar C3P0 es muy simple. De la documentación :
Pero si está ejecutando dentro de un servidor de aplicaciones, le recomendaría usar el grupo de conexiones incorporado que proporciona. En ese caso, deberá configurarlo (consulte la documentación de su servidor de aplicaciones) y recuperar una fuente de datos a través de JNDI:
fuente
Por lo general, si necesita un grupo de conexiones, está escribiendo una aplicación que se ejecuta en algún entorno administrado, es decir, se está ejecutando dentro de un servidor de aplicaciones. Si este es el caso, asegúrese de verificar qué funciones de agrupación de conexiones proporciona su servidor de aplicaciones antes de probar otras opciones.
La solución lista para usar será la mejor integrada con el resto de las instalaciones de los servidores de aplicaciones. Sin embargo, si no está ejecutando dentro de un servidor de aplicaciones, le recomendaría el componente Apache Commons DBCP . Se utiliza ampliamente y proporciona todas las funciones básicas de agrupación que requieren la mayoría de las aplicaciones.
fuente
HikariCP
Es moderno, es rápido, es simple. Lo uso para cada nuevo proyecto. Lo prefiero mucho al C3P0, no conozco demasiado bien los otros grupos.
fuente
No reinventes la rueda.
Pruebe uno de los componentes de terceros disponibles:
Apache DBCP viene con un ejemplo diferente sobre cómo configurar una agrupación javax.sql.DataSource . Aquí hay una muestra que puede ayudarlo a comenzar.
fuente
disclecsia
superó. Puede ver que el enlace es correcto. :)tomcat-jdbc
. Puede obtenerlo en Maven Central ->org.apache.tomcat:tomcat-jdbc:jar:7.0.22
-> search.maven.org/…Recomendaría usar la biblioteca commons-dbcp . Hay numerosos ejemplos enumerados sobre cómo usarlo, aquí está el enlace al movimiento simple . El uso es muy sencillo:
Solo necesita crear la fuente de datos una vez, así que asegúrese de leer la documentación si no sabe cómo hacerlo. Si no sabe cómo escribir correctamente las declaraciones JDBC para no filtrar recursos, también puede leer esta página de Wikipedia .
fuente
javax.sql.DataSource
definición de la interfaz contiene una implementación de "Connection pooling". (Además, creo que ya sabes qué es una interfaz JDBC)En el servidor de aplicaciones que usamos donde trabajo (Oracle Application Server 10g, según recuerdo), el servidor de aplicaciones maneja la agrupación. Recuperamos un
javax.sql.DataSource
uso de una búsqueda JNDI con unjavax.sql.InitialContext
.ha hecho algo como esto
(No escribimos este código, está copiado de esta documentación ).
fuente
Piscina
performance
[Al volver a usar los mismos objetos para realizar cualquier acción en los datos de objeto] ymemory
[asignar y desasignar muchos objetos crea una sobrecarga significativa de administración de memoria].«Agrupación [
Object
grupo, grupoString
constante, grupoThread
, grupo de conexiones]Grupo constante de cadena
Ejemplo: cadena para verificar el objeto único del grupo.
Agrupación de conexiones utilizando Tipo 4- Conductor uso de las bibliotecas 3 ª Parte [
DBCP2
,c3p0
,Tomcat JDBC
]Type 4 - The Thin driver converts JDBC calls directly into the vendor-specific database protocol Ex[Oracle - Thick, MySQL - Quora].
wikiEn el mecanismo del grupo de conexiones, cuando se carga la clase, obtiene los
physical JDBC connection
objetos y proporciona un objeto de conexión física envuelto al usuario.PoolableConnection
es un envoltorio alrededor de la conexión real.getConnection()
elija una de las conexiones envueltas libres del grupo de objetos de conexión y lo devuelva.close()
en lugar de cerrar, devuelve la conexión envuelta al grupo.Ejemplo: uso de ~ DBCP2 Connection Pool con Java 7 [
try-with-resources
]jdbc:<DB>:<drivertype>:<HOST>:<TCP/IP PORT>:<dataBaseName>
jdbc:
oracle
:thin:@localhost:1521:myDBName
jdbc:
mysql
://localhost:3306/myDBName
connectionpool.properties
Aplicación web : para evitar problemas de conexión cuando todas las conexiones están cerradas [MySQL "wait_timeout" por defecto 8 horas] para volver a abrir la conexión con la base de datos subyacente.
Puede hacer esto para probar todas las conexiones configurando testOnBorrow = true y validationQuery = "SELECT 1" y no use autoReconnect para el servidor MySQL, ya que está obsoleto. problema
Vea estos también:
fuente
public class StringPoolTest
solo tiene 2 métodos anulados para que no devuelvan nada. ¿Ese código realmente pasa por el proceso de administrar el grupo de cadenas? Ni siquiera parece utilizar ningún argumento.s1
¿no está definido?ConnectionPool
Clase. Muchas gracias.A finales de 2017, Proxool, BoneCP, C3P0, DBCP están desaparecidos en su mayoría en este momento. HikariCP (creado en 2012) parece prometedor, rompe las puertas de cualquier otra cosa que yo sepa. http://www.baeldung.com/hikaricp
Proxool tiene una serie de problemas:
- Bajo una carga pesada puede exceder el número máximo de conexiones y no regresar por debajo del máximo
- Puede lograr no regresar a las conexiones mínimas incluso después de que expiren las conexiones
- Puede bloquear todo el grupo (y todos los hilos del servidor / cliente) si tiene problemas para conectarse a la base de datos durante el subproceso de HouseKeeper (no usa .setQueryTimeout)
- El subproceso de HouseKeeper, mientras tiene un bloqueo de grupo de conexiones para su proceso, solicita al subproceso de Prototyper que vuelva a crear conexiones (barrido) que pueden resultar en una condición de carrera / bloqueo. En estas llamadas a métodos, el último parámetro siempre debe ser sweep: false durante el ciclo, solo sweep: true debajo de él.
- HouseKeeper solo necesita el barrido único de PrototypeController al final y tiene más [mencionado anteriormente]
- El hilo HouseKeeper comprueba las conexiones antes de ver qué conexiones pueden estar caducadas [existe el riesgo de probar una conexión caducada que puede romperse / terminarse a través de otros tiempos de espera para la base de datos en el firewall, etc.]
- El proyecto tiene código sin terminar (propiedades que están definidas pero sin actuar)
- La vida útil máxima predeterminada de la conexión si no se define es de 4 horas (excesiva)
- El hilo de HouseKeeper se ejecuta cada cinco segundos por grupo (excesivo)
Puede modificar el código y realizar estas mejoras. Pero como fue creado en 2003 y actualizado en 2008, le faltan casi 10 años de mejoras de Java que utilizan soluciones como hikaricp.
fuente
Como han respondido otros, probablemente estará satisfecho con Apache Dbcp o c3p0 . Ambos son populares y funcionan bien.
Sobre tu duda
No proporcionan implementaciones, sino interfaces y algunas clases de soporte, solo revelado por los programadores que implementan bibliotecas de terceros (grupos o controladores). Normalmente ni siquiera miras eso. Su código debe tratar las conexiones de su grupo como si fueran conexiones "simples", de manera transparente.
fuente
Vibur DBCP es otra biblioteca para ese propósito. En su sitio web se pueden encontrar varios ejemplos que muestran cómo configurarlo para usarlo con Hibernate, Spring + Hibernate o programáticamente: http://www.vibur.org/
Además, consulte el descargo de responsabilidad aquí .
fuente
Apache Commons tiene una biblioteca para ese propósito: DBCP . A menos que tenga requisitos extraños alrededor de sus grupos, usaría una biblioteca, ya que seguramente será más complicado y sutil de lo que esperaría.
fuente
Debería considerar el uso de UCP. Grupo de conexiones universal (UCP) es un grupo de conexiones de Java. Es un grupo de conexiones rico en características y está estrechamente integrado con las bases de datos Real Application Clusters (RAC), ADG, DG de Oracle.
Consulte esta página para obtener más detalles sobre UCP.
fuente
MiniConnectionPoolManager
es una implementación de un solo archivo Java, si está buscando una solución integrable y no está demasiado preocupado por el rendimiento (aunque no lo he probado en ese sentido).Es EPL , LGPL y MPL con múltiples licencias .
Su documentación también ofrece alternativas que vale la pena verificar (además de DBCP y C3P0):
fuente