Пул соединений с Apache DBCP

Я хочу использовать Apache Commons DBCP, чтобы включить пул соединений в приложении Java (источник данных, предоставляемый контейнером в это). На многих веб-сайтах, включая Apache site - использование библиотеки основано на этом фрагменте:

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

Затем вы получаете соединения с БД с помощью метода 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 пул соединений связан с connectionFactory следующим образом:
    введите описание изображения здесь

  4. Наконец, из пула соединений создается PoolingDataSource
    введите описание изображения здесь
person Ashutosh Jindal    schedule 02.09.2013