在我的应用程序中,我有一个方法重载的结构。一种方法没有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子句中的回滚,关闭等,而不会有未处理的错误。我还想询问commit
和close
实际启动它的事务/连接是否是最佳做法 - 在这种情况下是第一种方法。
对此方面的最佳做法的任何见解都会非常感激,或者您可能知道另一个已经回答的类似我的问题但我还没有找到。
答案 0 :(得分:0)
如果存在异常,则不会进行任何更改,也不必回滚。您只需关闭连接即可。最后提交是一种很好的做法。如果你想要最好的做法,那么你也必须对收盘进行尝试。而且我认为您不能将连接作为参数传递给回滚和提交。