Объединение соединений JDBC: повторное использование соединений?
Как я понимаю, JDBC Connection Pooling (на базовом уровне) работает следующим образом:
- создавать соединения во время инициализации приложения и помещать в кеш
- предоставлять эти кэшированные подключения по требованию к приложению
- отдельный поток поддерживает пул соединений, выполняя такие действия, как:
- отменить соединения, которые были использованы (закрыты)
- создавать новые подключения и добавлять кэш для поддержки определенного количества подключений
Но, когда я слышу термин "повторное использование соединения" в обсуждении пула соединений JDBC, я запутываюсь. Когда происходит повторное использование соединения?
Означает ли это, что пул соединений обеспечивает одно и то же соединение для двух разных взаимодействий с базой данных (без его закрытия)? Или, есть ли способ продолжить использование соединения даже после того, как он закрывается после вызова БД?
Ответы
Ответ 1
Объединение пулов работает путем повторного использования соединений. Приложения "заимствуют" соединение из пула, а затем "возвращают" его при завершении. Затем соединение снова передается в другую часть приложения или даже в другое приложение.
Это абсолютно безопасно, если одно и то же соединение не используется двумя потоками одновременно.
Ключевым моментом с пулом соединений является предотвращение создания новых соединений там, где это возможно, поскольку обычно это дорогостоящая операция. Повторное использование соединений имеет решающее значение для производительности.
Ответ 2
Пул соединений не предоставляет вам фактический экземпляр подключения из драйвера, но возвращает оболочку. Когда вы вызываете "close()" в экземпляре Connection из пула, он не будет закрывать драйвер Connection, а вместо этого просто возвращает открытое соединение с пулом, чтобы его можно было повторно использовать (см. Ответ скаффмана).
Ответ 3
Объединение пулов повторных подключений.
Вот как подчеркивается apache dbcp.
Connection poolableConnection= apacheDbcpDataSource.getConnection();
Реализация Apache DBCP возвращает оболочку соединения, которая имеет тип PoolableConnection.
poolableConnection.close();
PoolableConnection.close() проверяет, закрыто ли фактическое базовое соединение или нет, если нет, то он возвращает этот экземпляр PoolableConnection в пул соединений ( GenericObjectPool в этом случае).
if (!isUnderlyingConectionClosed) {
// Normal close: underlying connection is still open, so we
// simply need to return this proxy to the pool
try {
genericObjectPool.returnObject(this); //this is PoolableConnection instance in this case
....
}
Ответ 4
Мое понимание такое же, как указано выше, и, благодаря ошибке, у меня есть доказательства того, что это правильно. В приложении, с которым я работаю, возникла ошибка - команда SQL с недопустимым именем столбца. При выполнении генерируется исключение. Если соединение закрыто, то в следующий раз, когда соединение будет получено и использовано, с правильным SQL на этот раз, исключение будет сброшено снова, а сообщение об ошибке будет таким же, как в первый раз, хотя неправильное имя столбца даже не отображается в второй SQL. Поэтому соединение, очевидно, используется повторно. Если соединение не закрывается после того, как выбрано первое исключение (из-за плохого имени столбца), то при следующем подключении все работает нормально. Предположительно, это связано с тем, что первое соединение не было возвращено в пул для повторного использования. (Эта ошибка происходит с Jave 1.6_30 и подключением к базе данных MySQL.)