代码之家  ›  专栏  ›  技术社区  ›  TCCV

在单个方法中重用连接对象

  •  0
  • TCCV  · 技术社区  · 6 年前

    我遇到过这种模式。可以重复使用 Connection 当您需要执行多个SQL语句时,是否在单个方法中使用?

    我最初的想法是在继续之前关闭所有资源:

    Connection conn = null;
    PreparedStatement ps = null;
    ResultSet rs = null;
    try {
        conn = ConnectionFactory.getConnection();
        ps = conn.prepareStatement("SELECT * FROM MYTABLE WHERE COL=?");
        ps.setString(1, "val");
        rs = ps.executeQuery();
        // get values used to determine the next statement type
    } catch (SQLException e) {
        LOG.error("SQL failed.", e);
    } finally {
        if(rs != null){rs.close();}
        if(ps != null){ps.close();}
        if(conn != null){conn.close();}
    }
    // Then another SQL statement is needed (either an UPDATE or INSERT).
    // Repeat the same pattern to open, use and close the connection
    

    这样做同样安全吗?如果它是安全的,有真正的好处吗?

    //... boilerplate
    try {
        conn = ConnectionFactory.getConnection();
        ps = conn.prepareStatement("SELECT * FROM MYTABLE WHERE COL=?");
        ps.setString(1, "val");
        rs = ps.executeQuery();
        // ... more
    
        ps = conn.prepareStatement("UPDATE MYTABLE SET COL=?")
        // ... etc
    } finally {
        if(rs != null){rs.close();}
        if(ps != null){ps.close();}
        if(conn != null){conn.close();}
    }
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   Andreas LppEdd    6 年前

    你说什么 应该 做,就是用 try-with-resources :

    //... boilerplate
    try (Connection conn = ConnectionFactory.getConnection()) {
        try (PreparedStatement ps = conn.prepareStatement("SELECT * FROM MYTABLE WHERE COL=?")) {
            ps.setString(1, "val");
            try (ResultSet rs = ps.executeQuery()) {
                // ... more
            }
        }
    
        try (PreparedStatement ps = conn.prepareStatement("UPDATE MYTABLE SET COL=?")) {
            // ... etc
        }
    }
    
        2
  •  1
  •   Nathan Hughes    6 年前

    重用连接不是反模式,完全可以。重用连接是两个语句在同一个本地JDBC事务中执行的唯一方法。如果您正在编写访问关系数据库的应用程序,您应该了解事务。

    the way try-with-resources handles the edge cases 使我避免使用JDBC而使用嵌套try finally块。

    如果这里有一个反模式,它直接使用JDBC,那么它的级别非常低,涉及大量的剪切和粘贴,并且不便于使用事务或连接池。使用Spring可以处理诸如划分数据库事务、使用连接池和关闭资源等细节。