2017-01-23 14 views
2

おはよう、
ほとんどの場合、に続いてDAOレイヤーを作成しようとしています。
私はフレームワークを使用していないことに注意してください。単純なJDBCです。DAOレイヤー内のJDBC接続

は、Connectionインスタンスを作成する上で見てみましょう:各CRUDメソッド内
を、私たちは次のような接続を得る:

Connection connection = daoFactory.getConnection(); 

だから我々は、新しい接続に我々はメソッドを呼び出すたびに取得します。
ここで取引を実装する方法は唯一の質問です。
私は2つのソリューションを参照してください。代わりにDaoFactoryフィールドの

  1. を、私は方法のうち共有接続のフィールドを使用します。 DAOごとに1つのConnectionを持つように。しかし、どの層がトランザクションを担当すべきか?私はサービス - DAOの間に何かを創り出すべきですか?
  2. 私は、トランザクションを作成するために必要な他のDAOのインスタンスのフィールドを作成します。例えば、私は1つの作成と2つの更新アクションを行う必要があるため、TransactionDaoにbankDransfer(1人のユーザーからの収入と別のユーザーへの追加)を実装する場合、このTransactionDaoにもUserDaoがあります。

私は多分それは上記のどれもない、適切なソリューションを知ってほしいです。
私は心配する必要がある並行処理の問題もありますか教えてください。

+0

地獄は、私は、人々は特に新しいユーザーによって、完全に合理的な質問を閉じるために投票見たときに私が感じるものに比べて何の憎しみを持っていません。 –

+0

私はあなたがこのhttp://stackoverflow.com/questions/12812256/how-do-i-implement-a-dao-manager-using-jdbc-and-connection-pools?answertab=oldest#tab-topこれを読むことをお勧めあなた自身の質問に答えるのに役立つかもしれません。 – fabfas

答えて

1

最も簡単な解決策は、メソッドの開始時に接続をつかみ、これの一部にする必要があるSQLを実行する方法の残りの部分にそれを渡して、常に単一DAOメソッド内でトランザクションを実行することですありがとうトランザクション。 私は、この単純なアプローチに代わる独自の方法を紹介するつもりはありません。 Springはこれをシーンの魔法の背後で行うことを可能にします。私はそれを行うための他のフレームワーク、数十もあると確信していますが、単純なままにしたい場合は単純にしておきます。 これらの方法のうちのいくつかは、スタンドアロンの一種でもある場合は、私はこのような何かをするだろう:

public void incBalance(int accountId, int val) { 
    Connection conn = daoFactory.getConnection(); 
    incBalance(conn, accountId, val); 
} 

private void incBalance(Connection conn, int accountId, int val) { 
    con.update(...); 
} 

public void transfer(...) { 
    Connection conn = daoFactory.getConnection(); 
    conn.beginTransaction(); 
    ... 
    incBalance(conn, acc1, val); 
    incBalance(conn, acc2, -val); 
    ... 
    conn.commit(); 
} 
+0

ありがとう、似たようなコードで自分の投稿を編集して、あなたが正しいと理解しているかどうか尋ねてみたいです。最後の質問です。 incDalanceをAccountDaoにカプセル化し、このフィールドをTransactionDao内に入れることはできますか?それは悪い習慣ではないでしょうか?私のコードは 'accountDao.update(connection、transaction.getReceiver())'と 'accountDao.update(connection、transaction.getSender())'のようになります。 – Sabine

+0

悪い習慣はどれですか?あなたはDao間の接続を通過しているということですか?私はそうだと確信していますが、私は通常、正しい、働く簡単なコードは悪い習慣であると私に言う人に耳を傾けません。 –