4

在我的 Java 应用程序的 DAO 层中,我有两个 DAO 类EmployeeDAOBankDAO. 我需要控制/处理他们的数据库事务。我使用连接池来获取数据库连接。

EmployeeDAO 类:

public class EmployeeDAO {
    String name;
    String empCode;
    int age;

    // Getters & Setters
}

BankDAO 类:

public class BankDAO {
    String bankName;
    String acNo;
    String empCode;

    // Getters & Setters
}

假设我要将与该员工相关的员工和银行帐户详细信息存储在两个数据库表中。首先我保存员工,然后我保存银行详细信息,如果在存储银行详细信息时发生错误,我需要回滚完整的交易。

如何在使用 DAO 时管理此类事务?

4

2 回答 2

3

如果您使用的是普通 JDBC,您可以做的是Connection在 DAO 类的两个实例中共享同一个实例。

public class EmployeeDAO {

    private Connection conn;

    public void setConnection(Connection conn) {
        this.conn = conn;
    }

    ...
}

public class BankDAO {

    private Connection conn;

    public void setConnection(Connection conn) {
        this.conn = conn;
    }

    ...
}

在客户端代码中,首先需要创建一个Connection对象实例。接下来,您需要启动事务,使用conn.setAutoCommit(false);. 将Connection对象实例传递给两个 DAO 类。如果任何操作都没有发生错误,conn.commit();则,否则,conn.rollback();

例如:

Connection conn = null;
try {
    // getConnection from pool

    conn.setAutoCommit(false);

    EmployeeDAO employeeDAO = new EmployeeDAO();
    employeeDAO.setConnection(conn);

    BankDAO bankDAO = new BankDAO();
    bankDAO.setConnection(conn);

    // save employee

    // save bank details

    conn.commit();

catch(Exception e) {
    if (conn != null) {
        conn.rollback();
    }
} finally {
    if (conn != null) {
        conn.close();
    }
}
于 2012-05-29T03:35:07.343 回答
2

当您从数据库打开一个连接时,您可以使用 方法启动一个新事务[Connection#setAutoCommit][1](false),执行所有插入/更新/删除操作并执行提交以保存所有这些更改,如果出现错误,您可以回滚所有操作或一个保存点。这是我所说的一个例子:

public void saveSomeData(DAOClass daoObject) {

    Connection con = null;
    try {
        con = getConnectionFromDBPool(); //get the connection from the connection pool
        con.setAutoCommit(false);
        //start your transaction
        PreparedStatement ps = con.prepareCall("insert into tablex values(?, ?)");
        ps.setInt(1, daoObject.getAttribute1());
        ps.setString(2, daoObject.getAttribute2());
        ps.execute();
        //add another insert/update/delete operations...
        //at the end, you commit the transaction
        con.commit();
    } catch (Exception e) {
        //start a rollback
        if (con != null) {
            try {
                con.rollback();
            } catch (Exception ex) {
            }
        }
        //handle the exception
        e.printStackTrace();
    } finally {
        if (con != null) {
            try {
                con.close();
            } catch (Exception e) {
            }
        }
    }
}

另一个提示:您应该在关闭连接之前手动关闭所有资源。这段代码只是解释性的,但我应该在使用后关闭准备好的语句。

有关处理交易的更多信息:

于 2012-05-29T03:29:38.787 回答