关闭数据库连接和异常处理

时间:2015-06-12 14:26:57

标签: java exception-handling database-connection

在我的应用程序中,我有一个方法重载的结构。一种方法没有Connection作为参数,而另一种方法具有。没有的只用于创建数据库连接,然后调用另一个。

在这个例子中,让我说我调用下面的第一个方法来创建一个新用户:

@Override
public User handleCreate(User item, boolean silent) throws DAOException {

    Connection conn = null;

    try {

        conn = daoFactory.getConnection();
        return handleCreate(conn, item, silent);

    } catch (SQLException ex) {
        rollback(conn);
        close(conn);
        throw new DAOException(ex);
    } finally {
        commit(conn);
        close(conn);
    }

}

和另一个Connection作为参数:

@Override
public User handleCreate(Connection conn, User item, boolean silent) throws DAOException {
    try {

        boolean hasError = false;
        conn.setAutoCommit(false);

        item.setUsername(item.getUsername().trim());

        if (item.getId() == 0) {                                    // Not registered user

            if (userDAO.existByName(conn, item.getUsername())) {    // Username already exist

                msg.setErrorMessage(MessageHandler.getMessage("user.create.error.userAlreadyExist"));
                hasError = true;

            }

            if (userDAO.existEmail(conn, item.getEmail())) {        // Email already exist

                msg.setErrorMessage(MessageHandler.getMessage("user.create.error.emailAlreadyexist"));
                hasError = true;

            }

            if (!hasError) {                                        // No unique violations

                Integer id = userDAO.create(conn, item);                  // Create
                item.setId(id);
                msg.addMessage(MessageHandler.getMessage("user.create.completeMsg"));

            }

        } else {                                                    // Registered user

            msg.setErrorMessage(MessageHandler.getMessage("user.create.error.userAlreadySet"));

        }

        commit(conn);
        close(conn);

        return item;

    } catch (SQLException ex) {
        rollback(conn);
        close(conn);
        throw new DAOException(ex);
    } catch (DAOException ex) {
        rollback(conn);
        close(conn);
        throw ex;
    } finally {
        commit(conn);
        close(conn);
    }

}

我想问的是什么是最佳做法。我相信我过度捕捉并且我不确定如何减少catch子句中的回滚,关闭等,而不会有未处理的错误。我还想询问commitclose实际启动它的事务/连接是否是最佳做法 - 在这种情况下是第一种方法。

对此方面的最佳做法的任何见解都会非常感激,或者您可能知道另一个已经回答的类似我的问题但我还没有找到。

1 个答案:

答案 0 :(得分:0)

如果存在异常,则不会进行任何更改,也不必回滚。您只需关闭连接即可。最后提交是一种很好的做法。如果你想要最好的做法,那么你也必须对收盘进行尝试。而且我认为您不能将连接作为参数传递给回滚和提交。