关闭多个语句和结果集的有效方法?

Posted

技术标签:

【中文标题】关闭多个语句和结果集的有效方法?【英文标题】:Efficient way to close multiple statements and resultsets? 【发布时间】:2021-03-25 13:17:14 【问题描述】:

我尝试在一个 finally 块中将它们全部关闭,但它导致了 ORA-01000ORA-00604 错误。所以现在,我所做的是,每个语句和结果集都有自己的 try-catch-finally 块。它工作得非常好,但我仍然想知道是否有更有效的方法来关闭所有语句和结果集

try
    Connection conn = HikariCp.getConnection();

    try
        String sql1 = "SELECT * FROM TABLE1";
        PreparedStatement pst1 = conn.prepareStatement(sql1);
        ResultSet rs1 = pst1.executeQuery();

    catch(SQLException e)
        JOptionPane.showMessageDialog(this,e.getMessage());
    finally
        try  if (rs1 != null) rs1.close();  catch (Exception e) ;
        try  if (pst1 != null) pst1.close();  catch (Exception e) ;
    

    try
        String sql2 = "SELECT * FROM TABLE2";
        PreparedStatement pst2 = conn.prepareStatement(sql2);
        ResultSet rs2 = pst2.executeQuery();

    catch(SQLException e)
        JOptionPane.showMessageDialog(this,e.getMessage());
        
    finally
        try  if (rs2 != null) rs2.close();  catch (Exception e) ;
        try  if (pst2 != null) pst2.close();  catch (Exception e) ;
    

    try
        String sql2 = "SELECT * FROM TABLE3";
        PreparedStatement pst3 = conn.prepareStatement(sql3);
        ResultSet rs3 = pst3.executeQuery();

    catch(SQLException e)
        JOptionPane.showMessageDialog(this,e.getMessage());
    finally
        try  if (rs3 != null) rs3.close();  catch (Exception e) ;
        try  if (pst3 != null) pst3.close();  catch (Exception e) ;
    

catch(Exception e)
    JOptionPane.showMessageDialog(this,e.getMessage());
finally
    try  if (conn != null) conn.close();  catch (Exception e) ;

【问题讨论】:

try-with-resources 应该会缩短很多。 【参考方案1】:

luk2302 所说的 - 使用 try-with-resources。这会在执行该块后自动关闭连接。

您最初在一个 finally 块中关闭所有连接的想法并不理想,因为您将未使用的连接保持打开状态。 根据您的数据库,您只能打开 X 个连接,因此这可能是错误的原因。

【讨论】:

【参考方案2】:

如果您可以使用 Spring JDBC 模板,那么您将不必关闭任何连接。 春天会照顾你的。

private void create(Datasource dataSource) throws SQLException 

        JdbcTemplate template = new JdbcTemplate(dataSource);
        template.execute("your query");
    

【讨论】:

以上是关于关闭多个语句和结果集的有效方法?的主要内容,如果未能解决你的问题,请参考以下文章

用于返回结果集的 where 子句中的 case 语句包含空值

游标的使用

多条SQL语句对查询结果集的垂直合并

MS SQL语句declare游标的求助

iterator接口的hasnext方法、next方法和ResultSet结果集的next方法的区别

实体框架 - 具有多个结果集的存储过程 - 没有行返回