0


最近在看tomcat服务器频繁挂起的情况,发现部分代码经常抛出一些异常。

当我检查代码时,它看起来像这样

public static String doSomething() {
    String returnVakue = "default value";

    try {
        ResultSet rs = getMyResultSet(); 

        rs.first(); 
        returnValue = rs.getString("my_field"); // Note that Exception happens at times when the ResultSet is empty

    } catch (Exception e) {
        throw new Exception(e);
    } finally {
        return returnValue;
    }

}

虽然我知道同时抛出异常和返回是完全可以的,但想知道这是否会导致 tomcat 中的任何类型的泄漏。性能是否存在任何潜在风险。? 但是,我的调用者函数此时会停止执行。对此有何看法?对GC有影响吗?

编辑:注意:我知道如何更正此代码。请分享您的看法,这是否可能导致 tomcat 挂起。

4

2 回答 2

0

首先检查返回的 ResultSet 是否为空。

while( rs.next() ) {
    // ResultSet processing here
    // Result set is not empty
}

在我看来,抛出异常是你的决定,但最后你应该进行清理,例如关闭连接。

如果未关闭,打开连接将导致 tomcat 挂起,因为到达服务器的新请求将等待连接可用。

Java中引用的任何对象都不会被垃圾收集,在您的情况下,如果连接没有关闭,那么这些对象将不会被垃圾收集。

干杯!!

于 2013-08-19T20:23:50.320 回答
0

如果查询需要很长时间,则不是 JDBC 的问题。数据库负责。当然,如果 JDBC 使用得当的话。另一方面,如果您使用简单的 JDBC,最好在您的应用程序中添加一个层 DAO。

public class UserDAO extends DAO {

    private static final String FIND_BY_PK_SQL = 
        "SELECT mail, password " +
        "  FROM user WHERE mail = ?";

    public User findByPk(final String mail) throws DAOException {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            conn = getConnection();
            ps = conn.prepareStatement(FIND_BY_PK_SQL);
            ps.setString(1, mail);
            rs = ps.executeQuery();
            if (rs.next()) {
                return fill(rs);
            }
            return null;
        } catch (final SQLException e) {
            throw new DAOException(e);
        } finally {
            DbUtils.closeQuietly(conn, ps, rs);
        }
    }

    private User fill(final ResultSet rs) throws SQLException {
        final User user = new User();
        user.setMail(rs.getString("mail"));
        user.setPassword(rs.getString("password"));
        return user;
    }
}
于 2013-08-19T21:43:43.297 回答