如果JDBC Connection对象的作用域是本地的,是否需要显式关闭? (使用MySQL数据库)

时间:2016-11-04 17:47:52

标签: java mysql jdbc

我有一个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,也不能使用开源软件来处理它,因为工作必须是我自己的,因为这是大学工作(第二年)。

5 个答案:

答案 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都会非常慢,容易出错且占用资源。尝试使用连接池或至少以安全的方式重用打开的连接