我有一个Connection
类型的方法。一旦连接到数据库,它就会返回Connection
值。这是代码:
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;
之后调用相关的close方法会在NetBeans中给出一个无法访问的语句错误。编辑*我不能使用Pooling作为Java EE,也不能使用开源软件来处理它,因为工作必须是我自己的,因为这是大学工作(第二年)。
答案 0 :(得分:2)
Connection实现了AutoCloseable。
我会使用try-with-resources范例,因为它会自动关闭资源,而不需要显式关闭资源。
try(Connection connect = startConnection.establishConnection()){
}catch(SQLException e) {
e.printStackTrace();
return("failed");
}
可以找到有关使用JDBC对象尝试资源的更多信息here
有关try-with-resources的一般信息,请访问here
答案 1 :(得分: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的连接池。
答案 2 :(得分:1)
您需要显式关闭connection.Better创建一个Finally块并通过conn.close()关闭连接;
答案 3 :(得分:1)
您必须关闭连接对象,否则会创建可能导致数据库服务器崩溃的connectionLeaks。
本地范围限制了连接对象的使用,并且不会缩短生命周期。
答案 4 :(得分:1)
你应该关闭连接,但是严格地说不需要,因为之前或之后它将被jvm关闭。但你不知道什么时候,所以你可能会出现连接泄漏或内存问题。 但是,您应该检查您的架构。每次连接到db都会非常慢,容易出错且占用资源。尝试使用连接池或至少以安全的方式重用打开的连接