database-connection - dbcp2 - org.apache.commons.dbcp.basicdatasource maven
AgrupaciĆ³n de conexiones con Apache DBCP (2)
BasicDataSource es todo para las necesidades básicas. Crea internamente un PoolableDataSource y un ObjectPool.
PoolableDataSource implementa la interfaz DataSource utilizando un ObjectPool proporcionado. PoolingDataSource se ocupa de las conexiones y ObjectPool se preocupa de mantener y contar este objeto.
Yo recomendaría usar BasicDataSource. Solo, si realmente necesitas algo especial, entonces puedes usar PoolingDatasource con otra implementación de ObjectPool, pero será muy raro y específico.
BasicDataSource es seguro para subprocesos, pero debe tener cuidado de usar los accesores adecuados en lugar de acceder directamente a los campos protegidos para garantizar la seguridad de los subprocesos.
Quiero usar Apache Commons DBCP para habilitar la agrupación de conexiones en una aplicación Java (no hay un DataSource proporcionado por el contenedor en esto). En muchos sitios de la web, incluido el sitio de Apache , el uso de la biblioteca se basa en este fragmento de código:
BasicDataSource ds = new BasicDataSource();
ds.setDriverClassName("oracle.jdbc.driver.OracleDriver");
ds.setUsername("scott");
ds.setPassword("tiger");
ds.setUrl(connectURI);
Luego obtienes tus conexiones DB a través del método getConnection (). Pero en otros sitios, y también en el sitio de Apache , la instancia de Datasource se realiza a través de esto:
ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(connectURI,null);
PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory);
ObjectPool objectPool = new GenericObjectPool(poolableConnectionFactory);
PoolingDataSource dataSource = new PoolingDataSource(objectPool);
¿Cual es la diferencia entre ellos? ¿Estoy utilizando la agrupación de conexiones con BasicDataSource
, o necesito una instancia de PoolingDataSource
para trabajar con la agrupación de conexiones? ¿Es BasicDataSource
seguro para subprocesos (puedo usarlo como un atributo de Clase) o necesito sincronizar su acceso?
Esto es más que un (grande) comentario de apoyo a la respuesta de ivi anterior, pero lo publico como una respuesta debido a la necesidad de agregar instantáneas.
BasicDataSource es todo para las necesidades básicas. Crea internamente un PoolableDataSource y un ObjectPool.
Quería ver el código en BasicDataSource para corroborar esa afirmación (que resulta ser cierta). Espero que las siguientes instantáneas ayuden a futuros lectores.
Lo siguiente sucede cuando la primera vez que hace un basicDatasource.getConnection()
. La primera vez alrededor del DataSource se crea de la siguiente manera:
Esta es la conexión directa de la fábrica.
Este es el Grupo de objetos genéricos (''connectionPool'') que se usa en los pasos restantes.
Esto combina los dos anteriores (connectionFactory + un grupo de objetos) para crear un PoolableConnectionFactory.
Significativamente, durante la creación de PoolableConnectionFactory, connectionPool se vincula con connectionFactory de esta manera:- Finalmente, se crea un PoolingDataSource desde connectionPool