Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用DAOs进行事务管理_Java_Mysql_Transactions_Dao - Fatal编程技术网

Java 使用DAOs进行事务管理

Java 使用DAOs进行事务管理,java,mysql,transactions,dao,Java,Mysql,Transactions,Dao,在Java应用程序的DAO层中,我有两个DAO类EmployeeDAO和BankDAO。我需要控制/处理他们的数据库事务。我使用连接池来获取数据库连接 雇员类别: public class EmployeeDAO { String name; String empCode; int age; // Getters & Setters } public class BankDAO { String bankName; String acN

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

雇员类别:

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

    // Getters & Setters
}
public class BankDAO {
    String bankName;
    String acNo;
    String empCode;

    // Getters & Setters
}
班道等级:

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

    // Getters & Setters
}
public class BankDAO {
    String bankName;
    String acNo;
    String empCode;

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


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

当您从数据库打开连接时,可以使用方法
[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) {
            }
        }
    }
}
另一个提示:您应该在关闭连接之前手动关闭所有资源。这段代码只是解释性的,但我必须在使用它之后关闭准备好的语句

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


如果您使用的是普通JDBC,那么您可以在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;
    }

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

e、 g:


确保他们使用相同的数据库连接。是的,我使用的是相同的数据库连接。类通常接收一个类域对象,其中包含表的字段。请记住
连接#回滚
连接#关闭
可以引发SQLException,并且应该位于
try catch
blockHi Luiggi中,我想知道daoObject.getAttribute1()可以用daoObject.getParameter替换它,还是我必须在控制器层单独执行?@KarenGoh是的,你可以。但是,我必须使用HTTPRequest req作为参数之一,然后才能正确执行?如果我把所有的东西都作为一种方法放在那里,那么我的控制器层以后会怎样呢?