Что такое объект соединения в JDBC? Как поддерживается это соединение (я имею в виду, это сетевое соединение)? Являются ли они соединениями TCP/IP? Почему создание Connection каждый раз является дорогостоящей операцией? Почему через какое-то время эти соединения устаревают, и мне нужно обновить пул? Почему я не могу использовать одно соединение для выполнения нескольких запросов?
Что такое соединение в JDBC?
Ответы (4)
Эти соединения являются соединениями TCP/IP. Чтобы не создавать каждый раз новое соединение, существуют пулы соединений, которые динамически расширяются и сжимаются. Вы можете использовать одно соединение для нескольких запросов. Я думаю, вы имеете в виду, что вы выпускаете его в пул. Если вы сделаете это, вы можете получить то же соединение из пула. В этом случае просто не имеет значения, делаете ли вы один или несколько запросов.
Стоимость соединения заключается в подключении, которое занимает некоторое время. И база данных готовит некоторые вещи, такие как сеансы и т. Д., Для каждого соединения. Это нужно было бы делать каждый раз. Соединения устаревают по нескольким причинам. Наиболее заметным из них является брандмауэр между ними. Проблемы с подключением могут привести к сбросу подключения или простому тайм-ауту.
Чтобы добавить к другим ответам:
Да, вы можете повторно использовать одно и то же соединение для нескольких запросов. Это даже целесообразно, так как создание нового соединения довольно затратно.
Вы даже можете выполнять несколько запросов одновременно. Вам просто нужно использовать новый экземпляр java.sql.Statement/PreparedStatement для каждого запроса. Операторы — это то, что JDBC использует для отслеживания текущих запросов, поэтому для каждого параллельного запроса требуется свой собственный оператор. Однако вы можете и должны повторно использовать операторы для последовательных запросов.
Ответы на ваши вопросы заключаются в том, что они определяются реализацией. Соединение JDBC — это интерфейс, предоставляющий методы. То, что происходит за кулисами, может быть чем угодно, что обеспечивает интерфейс. Например, рассмотрим внутренний драйвер JDBC Oracle, используемый для поддержки хранимых процедур Java. Одновременные запросы не только возможны, они более или менее неизбежны, так как каждый запрос на новое соединение возвращает один и тот же объект соединения. Я не знаю точно, использует ли он TCP/IP внутри, но я сомневаюсь в этом.
Таким образом, вы не должны брать на себя детали реализации, не зная точно, какую именно реализацию JDBC вы используете.
поскольку я еще не могу комментировать, опубликую ответ только для того, чтобы прокомментировать ответ Vinegar, ситуация с возвратом setAutoCommit() в состояние по умолчанию после возврата соединения с пулом не является обязательным поведением и не должна восприниматься как должное, также как закрытие операторов и наборов результатов; вы можете прочитать, что он должен быть закрыт, но если вы их не закроете, они будут автоматически закрыты с закрытием соединения. Не принимайте это как должное, так как это потребует ваших ресурсов в некоторых версиях драйверов jdbc.
У нас была серьезная проблема с базой данных DB2 на AS400, ребята, нуждающиеся в изоляции транзакций, вызывали connection.setAutoCommit(false) и после завершения работы возвращали такое соединение в пул (JNDI) без connection.setAutoCommit(old_state), поэтому, когда другой поток получил это соединение из пула вставки и обновления не совершались, и долго никто не мог понять почему...