web-dev-qa-db-fra.com

Pool de connexions avec Apache DBCP

Je souhaite utiliser Apache Commons DBCP pour activer le regroupement de connexions dans une application Java (pas de DataSource fourni par le conteneur). Dans de nombreux sites du Web, y compris - site Apache - l'utilisation de la bibliothèque est basée sur cet extrait:

BasicDataSource ds = new BasicDataSource();
ds.setDriverClassName("Oracle.jdbc.driver.OracleDriver");
ds.setUsername("scott");
ds.setPassword("tiger");
ds.setUrl(connectURI);  

Ensuite, vous obtenez vos connexions DB via la méthode getConnection (). Mais sur d'autres sites -et Site Apache également - l'instance Datasource se fait par ceci:

ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(connectURI,null);
PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory);
ObjectPool objectPool = new GenericObjectPool(poolableConnectionFactory);
PoolingDataSource dataSource = new PoolingDataSource(objectPool);

Quelle est la différence entre eux? J'utilise le pool de connexions avec BasicDataSource, ou j'ai besoin d'une instance de PoolingDataSource pour travailler avec le pool de connexions? BasicDataSource est-il sûr pour les threads (puis-je l'utiliser comme attribut de classe) ou dois-je synchroniser son accès?

23

BasicDataSource est tout pour les besoins de base. Il crée en interne un PoolableDataSource et un ObjectPool.

PoolableDataSource implémente l'interface DataSource à l'aide d'un ObjectPool fourni. PoolingDataSource prend soin des connexions et ObjectPool prend soin de tenir et de compter cet objet.

Je recommanderais d'utiliser BasicDataSource. Seulement, si vous avez vraiment besoin de quelque chose de spécial, vous pouvez utiliser PoolingDatasource avec une autre implémentation d'ObjectPool, mais ce sera très rare et spécifique.

BasicDataSource est thread-safe, mais vous devez prendre soin d'utiliser les accesseurs appropriés plutôt que d'accéder directement aux champs protégés pour assurer la sécurité des threads.

24
ivi

Il s'agit plus d'un (gros) commentaire de soutien à la réponse d'ivi ci-dessus, mais je le poste en tant que réponse en raison de la nécessité d'ajouter des instantanés.

BasicDataSource est tout pour les besoins de base. Il crée en interne un PoolableDataSource et un ObjectPool.

Je voulais regarder le code dans BasicDataSource pour justifier cette déclaration (qui s'avère être vraie). J'espère que les instantanés suivants aideront les futurs lecteurs.


Ce qui suit se produit lors de la première exécution d'une basicDatasource.getConnection(). La première fois que le DataSource est créé comme suit:

enter image description here


  1. Il s'agit de la connectionFactory brute.

  2. Il s'agit du pool d'objets génériques ('connectionPool') utilisé dans les étapes restantes. enter image description here

  3. Cela combine les deux ci-dessus (connectionFactory + un pool d'objets) pour créer un PoolableConnectionFactory.
    enter image description here

    De manière significative, lors de la création de PoolableConnectionFactory, le connectionPool est lié à la connectionFactory comme ceci:
    enter image description here

  4. Enfin, un PoolingDataSource est créé à partir du connectionPool
    enter image description here
25
Ashutosh Jindal