使用一个连接 - 样式选择执行两个Java PreparedStatements

Kev*_*Jin 8 java resources jdbc

好吧,我已经意识到我确实在没有回馈社区的情况下问过太多问题,但我希望你对此有所了解.如果我有话

private void closeAll(ResultSet rs, PreparedStatement ps, Connection con) {
    if (rs != null)
        try {
            rs.close();
        } catch (SQLException e) {
        }
    if (ps != null)
        try {
            ps.close();
        } catch (SQLException e) {
        }
    if (con != null)
        try {
            con.close();
        } catch (SQLException e) {
        }
}
Run Code Online (Sandbox Code Playgroud)

我想使用单个连接在我的MySQL数据库上进行多项操作.写作更好吗?

Connection con = ...;
PreparedStatement ps = null;
ResultSet rs = null;
try {
    ps = con.prepareStatement(...);
    rs = ps.executeQuery();
    if (rs.next()) ...;
} catch (SQLException e) {
    System.err.println("Error: " + e);
} finally {
    closeAll(rs, ps, null);
}
try {
    ps = con.prepareStatement(...);
    rs = ps.executeQuery();
    if (rs.next()) ...;
} catch (SQLException e) {
    System.err.println("Error: " + e);
} finally {
    closeAll(rs, ps, con);
}
Run Code Online (Sandbox Code Playgroud)

要么

Connection con = ...;
PreparedStatement ps = null;
ResultSet rs = null;
try {
    ps = con.prepareStatement(...);
    rs = ps.executeQuery();
    if (rs.next()) ...;
    rs.close();
    ps.close();

    ps = con.prepareStatement(...);
    rs = ps.executeQuery();
    if (rs.next()) ...;
} catch (SQLException e) {
    System.err.println("Error: " + e);
} finally {
    closeAll(rs, ps, con);
}
Run Code Online (Sandbox Code Playgroud)

我认为更好的意思是更安全,更清晰,更简洁或更强大.我不确定后者是否总是关闭任何准备好的语句和结果集在遇到异常时都是打开的,而我相信它看起来更简洁.但前者看起来更好,因为它更加一致,但由于它使用了更多尝试最终块,因此它增加了更多的开销.

我意识到Java 7的Project Coin的自动资源管理部分将迫使我倾向于前者,因为标题中使用的资源在内部是隐式最终的.但是,在我不得不担心修改我的代码以使其适应ARM并且能够删除样板代码之前我还有一段时间,所以问题仍然存在:在上述两种样式中,哪种更好的做法?如果他们都做了预期的行为,后者会给我一个明显的性能提升,可以原谅"丑陋"的风格吗?

Dan*_*ake 6

在我看来,这是个人偏好的情况.在我的时间里,我编写了类似于两个块的代码.至于性能,我认为不会有特别显着的差异,只有性能测试才能说明.

可能的情况是,一个版本提供的毫秒左右的差异并不是十分钟左右的重要一半,以至于另一个人在您编写代码六个月后阅读代码时会花费一些时间来询问原因.

我个人的偏好是第二个.你说你正在建立一个对数据库开放的连接.使用第一个代码块,如果你得到一个异常抛出,那将被处理但是你会下降到第二个try/catch并再试一次.如果第一个失败,您可能不希望这样.对于第二个,例外情况会导致您退出代码然后关闭连接.

我主要用C#编程.这是大约八年前我上次做任何Java的时候.但我认为有很多C#程序员都在思考这个问题.无论如何我都有.