В Java для подключения к БД всегда используется драйвер JDBC. Ни одна БД, о которой я знаю, не позволяет выполнять более одной команды SQL через одно соединение одновременно , поэтому каждое соединение становится узким местом, если ваше приложение может выполнять несколько команд SQL одновременно (обычно чехол для веб-серверов, где сотни пользователей могут одновременно взаимодействовать с базой данных).
ОБНОВЛЕНИЕ : Я говорю следующее: вы можете легко объединять команды в одно соединение (например, UPDATE ... ; COMMIT
), но вы не можете отправлять две UPDATE
команды одновременно - вам всегда нужно ждать завершения первой команды, прежде чем вы сможете отправить следующую. Некоторые базы данных позволяют отправлять несколько команд в одном запросе, но они выполняются одна за другой , а не все одновременно . Подумайте об этом: если бы вы могли выполнять несколько команд одновременно по одному соединению, как бы вы узнали, в каком порядке они выполнялись?
Кроме того, создание соединений с БД обходится дорого для большинства БД. Следовательно, они создаются заранее во время запуска приложения и хранятся в пуле. Как только вы подключаетесь к базе данных с помощью драйвера JDBC в пуле, он выбирает неиспользуемое соединение из пула и возвращает его. Это (почти) не занимает много времени. Когда вы «закрываете» соединение, оно возвращается в пул.
В качестве дополнительного преимущества пул может поддерживать соединения живыми. Поэтому вам не нужно беспокоиться об ошибках соединения, когда вам нужно новое соединение (ну, пока БД работает).
Со стороны приложения это либо прозрачно (большинство драйверов JDBC либо объединяются в пул сегодня, либо имеют API-интерфейс пула). Если драйвер JDBC этого не делает, вы всегда можете использовать пул, такой как DBCP. Пул обрабатывает все неприятные детали, и вы пишете свое приложение на основе API пула, а не напрямую используете JDBC. Документы расскажут вам, как это сделать.
Как Hibernate другой зверь. Hibernate - это слой поверх JDBC, который может преобразовывать POJO в SQL и обратно.
Таким образом, вместо того, чтобы сказать INSERT INTO data(ID, VALUE) values (?, ?)
, вы можете сказать
class Pojo { long id; String value; }
Pojo demo = new Pojo();
demo.value = "Test";
session.persist(demo);
и Hibernate создаст для вас SQL и отправит его в БД. На данном этапе это не делает вашу жизнь проще. Hibernate начинает светиться, когда вы меняете Pojos:
class Pojo { long id; String value;
String name; // Oops ... forget the name
}
Pojo demo = new Pojo();
demo.name = "John";
demo.value = "Test";
session.persist(demo);
Hibernate соответствующим образом изменит определение БД и обновит все команды SQL, необходимые для загрузки и сохранения объектов.