- Соединение должно быть закрыто, чтобы его можно было вернуть в пул.
- Всегда закрывать соединение в блоке finally.
- Никогда не хранить ссылки на соединения как члены класса - этоподвержен ошибкам и плохой дизайн.Соединения должны быть обнаружены как можно позже и освобождены как можно скорее.Не имеет смысла хранить что-то подобное в качестве члена класса.
- Закрывайте соединения там, где они используются.Ваш код снова подвержен ошибкам.Если вы забыли позвонить
closeDatabase()
, у вас утечка соединений.
Внимание: не путайте, закрывая connection
и закрывая connection pool
здесь.
Потому что это былозапросил вот какой-то код для правильной и правильной обработки соединения:
public void doSomethingWithDb(Connection con, ...) {
boolean release = (con == null);
try {
con = PersistenceUtils.getConnection(con); //static helper return a new conenction from pool when provided con==null otherwise simply returns the given con
//do something
if(release) {
con.commit();
}
}
catch(SQLException e) {
//handle errors, i.e. calling con.rollback() but be sure to check for con!=null before. Again maybe null-safe static helper method here.
}
finally {
if(release && con!=null){
con.close();
}
}
}
Я использую Connection в качестве параметра метода, чтобы иметь возможность вызывать многие из таких методов в одной транзакции БД.Но вы всегда можете указать null
в качестве первого аргумента для Connection, и метод получит для вас соединение из пула.
Когда вы вызываете другой «DB-Method» внутри «DB-Method», вы просто предоставляете свойподключение к базовому методу - таким образом, у вас есть все в одной транзакции.
Как видите, правильный код JDBC дает много стандартного кода.На первом шаге вы можете уменьшить его, реализовав Utility-Class, такой как PersistenceUtils, который предоставляет статические нулевые безопасные методы, такие как commit (Connection), rollback (Connection), getConnection (Connection), close (Connection) ... С этим вы получаетеизбавьтесь от всех нулевых проверок, и вы также можете включить ведение журнала или что-то еще.