#jdbc
Вопрос:
Я хочу использовать несколько потоков для выполнения SQL-запросов. Выделение одного подключения к базе данных для каждого потока приведет к большим накладным расходам. Могу ли я, чтобы несколько потоков совместно использовали одно и то же подключение к базе данных и параллельно выполняли несколько SQL-запросов?
Комментарии:
1. Нет. Конечно нет. Каждый поток нуждается в своем собственном соединении.
2. «Выделение одного подключения к базе данных для каждого потока приведет к большим накладным расходам» , вероятно, намного меньшим, чем вы думаете, и не таким большим проблемам, как попытка совместного использования соединения одновременно.
Ответ №1:
Теоретически соединения JDBC должны быть потокобезопасными, но на практике это проблематично по двум причинам:
- Не все драйверы на самом деле потокобезопасны, и даже драйверы, которые утверждают, что они потокобезопасны, скорее всего, не прошли тщательную проверку на эту потокобезопасность, поскольку одновременное использование соединения из нескольких потоков не рекомендуется и не является редкостью.
- Использование одного соединения одновременно из нескольких потоков сопряжено со всевозможными дополнительными проблемами координации: фиксация или откат одного потока или переключение с автоматической фиксации false на автоматическую фиксацию true приведет к нарушению всех других потоков в одном и том же соединении: работа теряется или активные наборы результатов внезапно закрываются (например, из-за фиксации или требования JDBC о том, что выполнение инструкции в автоматической фиксации закроет все предыдущие наборы результатов в том же соединении).
Кроме того, если соединение разорвется (или будет закрыто одним из потоков), это также повлияет на все ваши другие потоки.
Кроме того, если драйвер потокобезопасен, эта потокобезопасность обычно достигается с помощью большого количества синхронизированных блоков или других форм взаимного исключения. Это может серьезно снизить производительность при использовании отдельных соединений, поскольку другим потокам придется ждать друг друга.
Использование соединения для каждого потока намного проще, так как оно изолирует работу одного потока от всех остальных. Кроме того, он обычно будет работать лучше из-за отсутствия оспариваемого доступа к соединению. Если вас беспокоит стоимость установки нескольких подключений, вам следует сделать две вещи:
- Используйте пул соединений, который позволяет легко повторно использовать соединения.
- Используйте пул потоков с ограниченным размером для выполнения фактической работы.
Это имеет много преимуществ: вы можете отправлять отдельные единицы работы в пул потоков; единица работы получает соединение из пула и возвращает его, когда оно будет выполнено (закрыв соединение). Использование пула соединений таким образом также позволяет легко заменять поврежденные соединения без необходимости обрабатывать это в самом коде приложения (кроме, возможно, повторной попытки для задачи, которая прервала соединение), и, наконец, использование пула соединений и пула потоков позволяет экспериментировать с размером, чтобы определить, какой размер подходит для обеспечения наилучшей пропускной способности вашего приложения.
Комментарии:
1. Большое вам спасибо, это мне очень помогло, и я отмечу это как ответ