首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java1.6 java.sql尝试/捕捉/最后疯狂编码

Java1.6 java.sql尝试/捕捉/最后疯狂编码
EN

Stack Overflow用户
提问于 2012-02-29 16:26:05
回答 4查看 2.1K关注 0票数 1

我目前正在创建许多使用连接池访问数据库的类。所以我得到了一个连接,创建了一个语句并得到了结果集。(我不能使用Java1.7和奇妙的自动资源管理)在完成我的方法时,我必须用一个最终块来完成:

代码语言:javascript
复制
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException sqle) {
                logger.error("Couldn't close result set", sqle);
            }
        }
        if (st != null) {
            try {
                st.close();
            } catch (SQLException sqle) {
                logger.error("Couldn't close statement", sqle);
            }
        }
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException sqle) {
                logger.error("Couldn't close connection", sqle);
            }
        }

我已经看到了XX类的噩梦,每个类都有4/5的方法。

创建一个助手类,为每种对象类型提供一个特殊的关闭方法,这样做是否是一个好做法:

代码语言:javascript
复制
public static void closeResource(Connection connection) {
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException sqle) {
                logger.error("Couldn't close connection", sqle);
            }
        }

然后用xx.close(connection);xx.close(statement);xx.close(rs);做我平常的xx.close(connection);xx.close(statement);xx.close(rs);

或者在同样的想法中(我知道在这一点上我会让一些人震惊,因为我自己也会觉得有点烦躁),有一个像public static void closeResources(Object... obj) {}这样的方法,有一个糟糕的instanceof列表?

或者根据你的经验,在任何地方编写代码都更好?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-02-29 16:30:38

使用Apache:http://commons.apache.org/dbutils/apidocs/org/apache/commons/dbutils/DbUtils.html

DbUtils.closeQuietly()可能是您所需要的

票数 2
EN

Stack Overflow用户

发布于 2012-02-29 16:28:09

使用超载。

代码语言:javascript
复制
private void close(ResultSet rSet) throws SQLException {
    if (rSet != null) {
        rSet.close();
    }
}

private void close(Statement statement) throws SQLException {
    if (statement != null) {
        statement.close();
    }
}

private void close(Connection conn) throws SQLException {
    if (conn != null) {
        conn.close();
    }
}

现在的使用将更加清洁:

代码语言:javascript
复制
try {
    // do db stuff
} catch (Exception e) {
    logger.error("log it", e);
} finally {
    close(rs);
    close(cs);
    close(conn);
}
票数 2
EN

Stack Overflow用户

发布于 2012-02-29 16:54:29

再举一个例子。适用于简单的小项目。

代码语言:javascript
复制
Object doRequest() throws SQLException {

    PreparedStatement ps = ... // initialize statement
    try {
        ResultSet rs = ps.executeQuery();
        try {

           // use ResultSet
           return someResult;

        } finally {
           rs.close();
        } 
    } finally {
        ps.close();
    }

}

虽然它不是一个完全的解决方案(许多嵌套的try-finally都很难读),但有几个优点:

  • 方法本身不处理异常处理。通常只有调用方可以决定如何处理异常。
  • 如下所示,方法总是返回正确的结果或抛出异常。只有当required.
  • Resources被初始化时,才不会关闭神奇的“错误值”。不需要检查close().

是否为null

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9502851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档