Mise en commun de la connexion avec Apache DBCP

je veux utiliser Apache Commons DBCP pour activer la mise en commun des connexions dans une Application Java (pas de source de données fournie par le conteneur). Dans de nombreux sites du web-y compris site Apache - l'usage de la Bibliothèque est basé sur cet extrait:

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

puis vous obtenez vos connexions DB par la méthode getConnection (). Mais sur d'autres sites et site Apache aussi - 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 connection pooling avec BasicDataSource ou j'ai besoin d'une instance de PoolingDataSource travailler avec la mise en commun des connexions? BasicDataSource thread-safe (puis-je l'utiliser comme attribut de classe) ou j'ai besoin de synchroniser son accès?

20
demandé sur Ashutosh Jindal 2013-01-23 00:33:32

2 réponses

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

PoolableDataSource implémente L'interface DataSource en utilisant un ObjectPool fourni. PoolingDataSource prendre soin des connexions et ObjectPool prendre soin de tenir et Compter cet objet.

je recommande D'utiliser BasicDataSource. Seulement, si vous avez vraiment besoin de quelque chose de spécial peut-être alors vous pouvez utiliser PoolingDatasource avec une autre implémentation de ObjectPool, mais il sera très rare et spécifique.

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

22
répondu ivi 2014-07-17 17:06:32

il s'agit plus d'un (grand) commentaire à l'appui de la réponse d'ivi ci-dessus, mais je l'affiche comme une 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 corroborer cette affirmation (qui s'avère être vraie). J'espère que la suite d'instantanés d'aider les futurs lecteur.


La suite se passe lors de la première fois qu'on fait un basicDatasource.getConnection(). La première fois autour de la source de données est créé comme suit :

enter image description here


  1. C'est le produit brut de connexion.

  2. Il s'agit du Pool D'objets génériques ('connectionPool') qui est utilisé dans les étapes suivantes. enter image description here

  3. cela combine les deux ci-dessus (connectionFactory + un Pool D'objets) pour créer unfactory Poolableconnection.

    enter image description here



    de manière significative, lors de la création du répertoire de connexion Poolableconnection, le connectionPool est lié au connectionFactory comme suit:

    enter image description here

  4. enfin, une source de Poolingdata est créée à partir du connectionPool

    enter image description here
24
répondu Ashutosh Jindal 2013-09-02 12:45:47