2016-11-04 4 views
0

У меня есть метод, который имеет тип Connection. Он возвращает значение Connection после его подключения к базе данных. Вот код:Если область объекта соединения JDBC является локальной, нужно ли ее явно закрывать? (Используется база данных MySQL)

public Connection establishConnection() 
{ 

    Connection conn = null; 
    try 
    { 
     this.readLogin(); // prompts user to input for user, pass and host variables using Scanner class 
     this.createDatabaseIfNeeded(); // creates chessleaguedb if not found  
     conn = DriverManager.getConnection 
        ("jdbc:mysql://"+host+":3306/chessleaguedb", user, pass); 
     System.out.println("Successfully connected to chessleaguedb"); 

    } 
    catch (SQLException z) 
    { 
     // logic 
    } 
    return conn; 
} 

Я создаю экземпляр класса этого метода в своем классе меню; вызовите выше метод и передать его возвращаемое значение объекта Connection в классе меню (я делаю это только, чтобы держать вещи в чистоте, и, надеюсь, придерживаться принципов хорошего дизайна OO):

DatabaseConnection startConnection = new DatabaseConnection(); // class the above method is located in 
Connection connect = startConnection.establishConnection(); 

Мой вопрос заключается в следующем: из-за активное соединение открывается в указанном выше методе, мне нужно явно закрыть его в методе? Или потому, что объект Connection в этом методе является локальным и не будет существовать после завершения метода, это необходимо? Я не могу закрыть его, потому что вызов соответствующего метода закрытия после return conn; дает мне недостижимую ошибку в NetBeans. EDIT * Я не могу использовать Pooling как не Java EE и не могу использовать программное обеспечение с открытым исходным кодом для его обработки, поскольку работа должна быть моей, так как это университетская работа (2-й год).

ответ

1

Да, вам необходимо написать & в поле closeConnection() в вашем DatabaseConnection class, иначе это создаст утечку соединения в приложении. Очень скоро ваше приложение закончит соединение.

Вы должны убедиться, что ниже closeConnection() вызывается в finally блоке одного и того же метода, с которого вы звоните establishConnection(), в противном случае ресурс (connection) избежит (протечки).

public void closeConnection(Connection conn) { 
    try { 
     conn.close(); 
    } catch(SQLException sqlexe) { 
    // Connection closing failed 
    //Log exception 
    } 
} 

Но, это не лучшая практика для обработки соединений в явном виде, как это, а попытаться использовать механизм соединения пула.

Вы можете посмотреть here для объединения пулов.

+0

Точно то, что мне нужно было знать. –

+2

Важным здесь является то, что ничего волшебного, когда переменные выпадают из области видимости. В конечном итоге они могут быть GCed, но это все; блокировки не освобождаются, соединения не возвращаются в пул, закрытые замки закрыты и т. д. –

+0

@javaguy ценят код. Если я должен был вызвать «conn.closeConnection()» после оператора return в методе, он дает мне ошибку недостижимого оператора. Может быть, это плохой дизайн с моей стороны в первую очередь, но как мне его закрыть в методе, который возвращает значение Connection? –

1

Вам необходимо явно закрыть соединение. Создайте блок finally и закройте соединение conn.close();

1

Вы должны закрыть объект соединения, иначе он создаст connectionLeaks, который может привести к сбою вашего сервера БД.

Объем, являющийся локальным, ограничивает использование объекта соединения и не уменьшает срок его службы.

2

Соединительные устройства AutoCloseable.

Я бы использовал парадигму try-with-resources, поскольку она автоматически закрыла ресурс, и нет необходимости явно закрывать ресурс.

try(Connection connect = startConnection.establishConnection()){ 

}catch(SQLException e) { 
    e.printStackTrace(); 
    return("failed"); 
} 

Более подробная информации о примерочной с-ресурсах с объектами JDBC можно найти here

Общей информации о примерочной с-ресурсы могут быть найдены here

+0

Очень интересно, «Connection реализует AutoCloseable» –

1

Вы должны закрыть соединение, однако строго не требуется, до или после этого он будет закрыт jvm. Но вы не знаете, когда, так что вы можете прийти к утечкам связи или проблемам памяти. Однако вы должны рассмотреть свою архитектуру.Соединение с db каждый раз было бы очень медленным, подверженным ошибкам и потребляющим ресурс. Попытайтесь работать с пулами подключений или, по крайней мере, повторно использовать открытое соединение безопасным способом.

+0

Также может быть, что некоторые другие части драйвера (или пула соединений) удерживаются в соединении, если они явно не закрыты, поэтому никогда не освобождайте соединение. –

Смежные вопросы