4

私の Java アプリケーションの DAO レイヤーには、2 つの DAO クラスEmployeeDAOBankDAO. データベース トランザクションを制御/処理する必要があります。接続プーリングを使用してデータベース接続を取得します。

従業員DAOクラス:

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

    // Getters & Setters
}

BankDAO クラス:

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

    // Getters & Setters
}

従業員とその従業員に関連する銀行口座の詳細を 2 つのデータベース テーブルに格納するとします。最初に従業員を保存し、次に銀行の詳細を保存します。銀行の詳細を保存するときにエラーが発生した場合は、トランザクション全体をロールバックする必要があります。

DAO を使用しているときにこの種のトランザクションを管理するにはどうすればよいですか?

4

2 に答える 2

3

Connectionプレーンな JDBC を使用している場合、DAO クラスの 2 つのインスタンスで同じインスタンスを共有することができます。

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) {
            }
        }
    }
}

もう1つのヒント:接続を閉じる前に、すべてのリソースを手動で閉じる必要があります。このコードは単なる説明ですが、使用後にプリペアドステートメントを閉じる必要があります。

トランザクションの処理に関する詳細:

于 2012-05-29T03:29:38.787 に答える