Подтвердить что ты не робот

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

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

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

Затем вы получаете свои соединения с DB через метод getConnection(). Но на других сайтах - и Apache Site также - экземпляр 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 потокобезопасным (могу ли я использовать его как атрибут класса) или мне нужно синхронизировать его доступ?

4b9b3361

Ответ 1

BasicDataSource - это все для удовлетворения основных потребностей. Он создает внутренне источник PoolableDataSource и ObjectPool.

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

Я бы рекомендовал использовать BasicDataSource. Только если вам действительно нужно что-то особенное, возможно, вы можете использовать PoolingDatasource с другой реализацией ObjectPool, но это будет очень редко и специфично.

BasicDataSource является потокобезопасным, но вы должны позаботиться о том, чтобы использовать соответствующие аксессоры, а не напрямую обращаться к защищенным полям, чтобы обеспечить безопасность потоков.

Ответ 2

Это больше (большой) поддерживающий комментарий для ответа ivi выше, но я отправляю его как ответ из-за необходимости добавления моментальных снимков.

BasicDataSource - это все для удовлетворения основных потребностей. Он создает внутренне PoolableDataSource и ObjectPool.

Я хотел посмотреть код в BasicDataSource, чтобы обосновать этот оператор (который оказывается правдой). Я надеюсь, что следующие снимки помогут будущим читателям.


Следующее происходит, когда первый раз выполняется basicDatasource.getConnection(). В первый раз вокруг DataSource создается следующее:

enter image description here


  • Это raw connectionFactory.

  • Это общий пул объектов ('connectionPool'), который используется на остальных этапах. enter image description here

  • Это объединяет два вышеупомянутых (connectionFactory + Пул объектов) для создания PoolableConnectionFactory.
    enter image description here

    Существенно, что при создании PoolableConnectionFactory connectionPool связан с connectionFactory следующим образом:
    enter image description here

  • Наконец, источник PoolingDataSource создается из connectionPool
    enter image description here