可以使用资源返回try内的连接对象

时间:2015-11-18 05:54:38

标签: java java-7

我将连接提供程序类作为bleow来返回连接。

 public class ConnectionProvider {

    static {
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    public static Connection ConnectDB() throws ClassNotFoundException, SQLException {  

        try (Connection connection = DriverManager
                .getConnection("jdbc:mysql://localhost:3306/jspservlet_test","root", "root");
                ) {

            return connection;
        }           
    }
}

这是调用连接提供程序的主要方法。

public void Test() {

        try {               
            Connection con =  ConnectionProvider.ConnectDB();

            PreparedStatement ps = con.prepareStatement("");                            

        } catch (SQLException e) {          

            e.printStackTrace();
        } catch (ClassNotFoundException e) {

            e.printStackTrace();
        }

    }

但是“com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:连接关闭后不允许任何操作。”错误总是显示在下面的代码行。

PreparedStatement ps = con.prepareStatement("");

因为,根据Oracle文档,如果使用资源java 7功能尝试,资源在try块后自动关闭,即使它发生了错误。所以,即使我已经关闭了连接,它已经关闭了。

让我知道,我的使用逻辑错了? 如何在try with resource中返回此连接? 我尝试了很多时间谷歌搜索解决方案,但没有得到方便的答案。

请告诉我你的建议和反馈。

3 个答案:

答案 0 :(得分:2)

你不能做什么...

在您try-with-resources连接之后return使用returnconnection(d)关闭(d)。您无法从try内部返回连接资源。

你能做什么......

try-with-resources(在connection内)传递给采用Connection的方法。您也可以使用ConnectionPool,并在需要时获取TreeItem(创建和执行查询)。

答案 1 :(得分:1)

请告诉我,我的使用逻辑是错误的?

在此上下文中使用'try-with-resources'逻辑是错误的,因为ConnectDB()的意图是返回一个连接实例,调用者实际可以使用它来发送SQL语句,但是相反,由于使用了“ try-with-resources ”Java构造,连接实例在被调用者使用之前会自动关闭。

答案 2 :(得分:1)

试用资源和JDBC的快速操作方法

您的ConnectionProvider的ConnectDB 已经声明它正在抛出SQLException - 所以不需要在这里捕获它:(您应该考虑用连接池替换此代码)

public class ConnectionProvider {
    static {
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    public static Connection ConnectDB() throws SQLException {  
      return DriverManager.getConnection("jdbc:mysql://localhost:3306/jspservlet_test","root", "root");
    }
}

而是在测试类中使用try-with-resource来清理代码并专注于SQL代码的错误 可能有:

public void Test() {

    try (Connection con =  ConnectionProvider.ConnectDB();
         PreparedStatement ps = con.prepareStatement("SELECT 1")) {
         //Prepare your Statement
         ps.setInt(1, 1);
         //And another try-with-resource for the result - note the closing brace
         try(ResultSet rs = ps.executeQuery()) {
            while(rs.next()) {
               //Handle your Result
               System.out.println(rs.getString(1));
            }
         } // This closes try-with-resource. Exception will be rethron to be caught in outer catch!          
    } catch (SQLException e) {          
        //SQL is Broken - but only ONE catch to catch them all
        e.printStackTrace();
    } 

}

这样你获得

  • 更好的代码可读性(没有调用close被finally包围,if!= null)
  • 集中式错误处理,如果SQL代码中的任何内容中断(因此您可以专注于&#34的功能错误;语句没有运行")
  • 更好的代码质量:无需担心游标,语句,连接无法关闭。