Пул соединений с 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
потокобезопасным (могу ли я использовать его как атрибут класса) или мне нужно синхронизировать его доступ?
Ответы
Ответ 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]()