Java 使用资源尝试如何使用自定义逻辑关闭连接

Java 使用资源尝试如何使用自定义逻辑关闭连接,java,Java,在下面的示例中,我们使用try with resource关闭连接并准备语句。它将关闭连接并准备好声明 而且我们正在使用2个try块,如下所述 用于关闭连接和准备好的语句 结束结果集 将来,如果我们有任何与文件相关的操作,那么我们将需要使用资源块编写另一个try try (Connection con = ds.getConnection(); PreparedStatement ps = con.prepareStatement(sql);) { try (ResultSet

在下面的示例中,我们使用try with resource关闭连接并准备语句。它将关闭连接并准备好声明

而且我们正在使用2个try块,如下所述

  • 用于关闭连接和准备好的语句
  • 结束结果集
  • 将来,如果我们有任何与文件相关的操作,那么我们将需要使用资源块编写另一个try

    try (Connection con = ds.getConnection();
         PreparedStatement ps = con.prepareStatement(sql);) {
        try (ResultSet rs = ps.executeQuery();) {
            while (rs.next()) {
                list.add(rs.getInt("id"));
            }
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
    
    但若我们并没有使用try with resource,那个么我们可以在单个try-catch块中重写上面的登录,如下所示

    try {
        Connection con = ds.getConnection();
        PreparedStatement ps = con.prepareStatement(sql);
        ResultSet rs = ps.executeQuery();
    
        while (rs.next()) {
            list.add(rs.getInt("id"));
        }
    } catch (Exception e) {
        // Closing RS
        // Closing PS
        // Closing Connection or Customized closing connection logic
    }
    
    问题:即使在关闭连接时有任何自定义操作,是否可以使用try-with-resource块


    另外,请建议在这种情况下哪种解决方案更好。

    几周前,我遇到了类似的问题。您不需要对资源进行多次尝试,您只能进行一次查看

    但是在您的第二个代码示例中,您不想关闭连接和catch块中的所有内容。最后必须使用

    简而言之,对于“普通”的东西,您只能使用一次try-with-resources,然后在后者内部创建另一个try-catch(或者使用对自定义方法的调用)来处理和关闭您的自定义操作

    try(Connection conn=datasource.getConnection();
    语句Statement=conn.createStatement();
    ResultSet rs=statement.executeQuery(请求);){
    while(rs.next())
    {
    //做你的事。
    }
    尝试
    {
    //做你的事。
    }捕获(无论是什么){
    //处理。
    }最后{
    //关闭你的定制物品。
    }
    }catch(SQLException-ex){
    //扔东西。
    }
    

    希望这能有所帮助。

    几周前我也遇到过类似的问题。您不需要对资源进行多次尝试,您只能进行一次查看

    但是在您的第二个代码示例中,您不想关闭连接和catch块中的所有内容。最后必须使用

    简而言之,对于“普通”的东西,您只能使用一次try-with-resources,然后在后者内部创建另一个try-catch(或者使用对自定义方法的调用)来处理和关闭您的自定义操作

    try(Connection conn=datasource.getConnection();
    语句Statement=conn.createStatement();
    ResultSet rs=statement.executeQuery(请求);){
    while(rs.next())
    {
    //做你的事。
    }
    尝试
    {
    //做你的事。
    }捕获(无论是什么){
    //处理。
    }最后{
    //关闭你的定制物品。
    }
    }catch(SQLException-ex){
    //扔东西。
    }
    

    希望这有帮助。

    使用资源进行尝试是一个更好的解决方案,因为它只在“尝试”块中使用您的连接。但是:

    catch (SQLException e)
    
    与以下情况不同:

     catch (Exception e) 
    
    (异常e)
    将捕获
    SQLException
    ,如果您说要执行一些与文件相关的操作,可能还会捕获
    FileNotFoundException
    IOException
    ,因此此捕获不是很有启发性。在我看来,您应该首先阅读单一责任原则,然后您会发现处理问题的最佳选择是创建两个try块,分别处理如下操作:

     public static List<Integer> getAllProducts() {
        List<Integer> productIds = new ArrayList<>();
        try (Connection con = ds.getConnection(); PreparedStatement ps = con.prepareStatement(sql);) {
            try (ResultSet rs = ps.executeQuery();) {
                while (rs.next()) {
                    productIds.add(rs.getInt("id"));
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return productIds;
    }
    
    public static void writeSomething(String fileName) {
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(fileName))) {
            writer.write("StackOverflow");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    公共静态列表getAllProducts(){ List productIds=new ArrayList(); try(Connection con=ds.getConnection();PreparedStatement ps=con.preparest陈述(sql);){ try(ResultSet rs=ps.executeQuery();){ while(rs.next()){ productIds.add(rs.getInt(“id”)); } } }捕获(SQLE异常){ e、 printStackTrace(); } 返回productid; } 公共静态void writeMething(字符串文件名){ try(BufferedWriter=new BufferedWriter(new FileWriter(fileName))){ write.write(“堆栈溢出”); }捕获(IOE异常){ e、 printStackTrace(); } }
    Try with resources是一个更好的解决方案,因为它只在“Try”块中使用您的连接。但是:

    catch (SQLException e)
    
    与以下情况不同:

     catch (Exception e) 
    
    (异常e)
    将捕获
    SQLException
    ,如果您说要执行一些与文件相关的操作,可能还会捕获
    FileNotFoundException
    IOException
    ,因此此捕获不是很有启发性。在我看来,您应该首先阅读单一责任原则,然后您会发现处理问题的最佳选择是创建两个try块,分别处理如下操作:

     public static List<Integer> getAllProducts() {
        List<Integer> productIds = new ArrayList<>();
        try (Connection con = ds.getConnection(); PreparedStatement ps = con.prepareStatement(sql);) {
            try (ResultSet rs = ps.executeQuery();) {
                while (rs.next()) {
                    productIds.add(rs.getInt("id"));
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return productIds;
    }
    
    public static void writeSomething(String fileName) {
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(fileName))) {
            writer.write("StackOverflow");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    公共静态列表getAllProducts(){ List productIds=new ArrayList(); try(Connection con=ds.getConnection();PreparedStatement ps=con.preparest陈述(sql);){ try(ResultSet rs=ps.executeQuery();){ while(rs.next()){ productIds.add(rs.getInt(“id”)); } } }捕获(SQLE异常){ e、 printStackTrace(); } 返回productid; } 公共静态void writeMething(字符串文件名){ try(BufferedWriter=new BufferedWriter(new FileWriter(fileName))){ write.write(“堆栈溢出”); }捕获(IOE异常){ e、 printStackTrace(); } }
    为什么要添加另一个资源尝试?为什么不将其添加到现有的try with resources中呢?我认为您无法(轻松或根本无法)干预自动关闭
    自动关闭的
    。。。如果您想确保在
    中关闭所有内容,请在没有资源的情况下尝试
    ,然后在
    最后
    块中关闭它,并在之前检查
    null
    。请描述“自定义关闭连接逻辑”。你到底想做什么?似乎你想做一些非常奇怪(和危险?)的事情。您可以使用自定义类包装给定的连接