Обединяване на връзки с Apache DBCP

Искам да използвам Apache Commons DBCP, за да активирам обединяването на връзките в приложение на Java (няма осигурен от контейнер DataSource в това). В много сайтове в мрежата - включително Apache сайт- използването на библиотеката се базира на този фрагмент:

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

След това получавате вашите DB връзки чрез метода getConnection(). Но на други сайтове - и сайт на Apache също- екземплярът на Datasource се прави чрез това:

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

Каква е разликата между тях? Използвам групиране на връзки с BasicDataSource или имам нужда от екземпляр на PoolingDataSource, за да работя с групиране на връзки? Нишково безопасен ли е BasicDataSource (мога ли да го използвам като атрибут на клас) или трябва да синхронизирам достъпа му?


person Carlos Gavidia-Calderon    schedule 22.01.2013    source източник


Отговори (2)


BasicDataSource е всичко за основните нужди. Той създава вътрешно PoolableDataSource и ObjectPool.

PoolableDataSource имплементира интерфейса DataSource с помощта на предоставен ObjectPool. PoolingDataSource се грижи за връзките, а ObjectPool се грижи за задържането и отчитането на този обект.

Бих препоръчал да използвате BasicDataSource. Само, ако наистина имате нужда от нещо специално, тогава можете да използвате PoolingDatasource с друга реализация на ObjectPool, но това ще бъде много рядко и специфично.

BasicDataSource е безопасен за нишки, но трябва да внимавате да използвате подходящи средства за достъп, вместо да осъществявате директен достъп до защитени полета, за да гарантирате безопасността на нишките.

person ivi    schedule 22.01.2013
comment
Какво имаш предвид с подходящи аксесоари? Синхронизирани блокове? - person Carlos Gavidia-Calderon; 23.01.2013
comment
BasicDataSource е безопасен за нишки, тъй като всички променливи се четат/записват чрез синхронизиране. Така че не мисля, че трябва да използвате блок за синхронизиране. Ако разширявате този клас, трябва просто да се погрижите да използвате подходящи инструменти за достъп, вместо да осъществявате директен достъп до защитени полета, за да осигурите безопасност на нишката, но не е необходимо да използвате блокове за синхронизиране. - person ivi; 23.01.2013

Това е по-скоро (голям) поддържащ коментар към отговора на ivi по-горе, но го публикувам като отговор поради необходимостта от добавяне на моментни снимки.

BasicDataSource е всичко за основните нужди. Той създава вътрешно PoolableDataSource и ObjectPool.

Исках да разгледам кода в BasicDataSource, за да обоснова това твърдение (което се оказва вярно). Надявам се следните моментни снимки да помогнат на бъдещите читатели.


Следното се случва, когато за първи път направите basicDatasource.getConnection(). Първият път около DataSource се създава, както следва:

въведете описание на изображението тук


  1. Това е необработената фабрика за свързване.

  2. Това е генеричният пул от обекти ('connectionPool'), който се използва в останалите стъпки. въведете описание на изображението тук

  3. Това комбинира горните две (connectionFactory + Object Pool), за да създаде PoolableConnectionFactory.
    въведете описание на изображението тук

    По-важно е, че по време на създаването на PoolableConnectionFactory, connectionPool е свързан с ConnectionFactory така:
    въведете описание на изображението тук

  4. Накрая се създава PoolingDataSource от connectionPool
    въведете описание на изображението тук
person Ashutosh Jindal    schedule 02.09.2013