0

私は次のようなものを持っています:
1) DBでアトミック操作を実行するためにjava.sql.Connectionクラスとjava.sql.PreparedStatementクラスなどのトランザクションを実行するために使用されるメソッドを持つDAOクラス。 2)java.lang.reflect。InvocationHandler実装者、whickは、トランザクションの前に接続を取得し、トランザクションの後にコミット/ロールバックするために使用されます。withdrawSum(int idAccount, float amount)putSum(int idAccount, float amount)

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    Connection connection = null;
    try{
        connection = DaoUtil.INSTANCE.getConnection();
        connection.setAutoCommit(false);
        method.invoke(connection, args);
        connection.commit();
    } catch(InvocationTargetException ex){
        connection.rollback();
    } finally{
        DaoUtil.INSTANCE.closeConnection(connection);
    }
    return null;
}

3)プロキシインスタンスを作成し、そのヘルプを使用してトランザクションを実行するメソッドを呼び出すトランザクションマネージャーは、次のようになります。

TransactionManager transManager = new TransactionManager();
InvocationHandler transHandler = new MyInvocationHandler(transManager);
TransactionManager proxy = (TransactionManager) Proxy.newProxyInstance(
            transManager.getClass().getClassLoader(), transManager.getClass().getInterfaces(), transHandler);
proxy.transferMoney(withdrawAccountid, putAccountId, transactionSum);

....。

   public void transferMoney(int withdrawAccountid, int putAccountId, float transactionSum){
            AccountDao.getInstance().withdrawSum(withdrawAccountid, transactionSum);
            AccountDao.getInstance().putSum(putAccountId, transactionSum);
    }

問題は、DAOメソッドでステートメントを実行するには、初期化されたConnectionオブジェクトが必要です。これは初期化され、InvocationHandlerのinvokeメソッドに渡されます。DAOメソッドでどのように正しく初期化する必要がありますか?何か案は?前もって感謝します。

4

1 に答える 1

1

トランザクションは当然スレッドに関連付けられているため、ここでの一般的なアプローチは、トランザクションのスコープ中にストレージに格納することですConnectionThreadLocal

次に、さまざまなアプローチを使用して、これらの接続をDAOで利用できるようにすることができます。

  • DAOはConnection、静的メソッドを呼び出すことでsを取得できます

  • カスタムDataSourceをDAOに注入できます。そのgetConnection()メソッドは、現在のトランザクションに関連付けられた接続を返します。無視するには、接続をプロキシする必要があることに注意してくださいclose()。このアプローチでは、DAOをトランザクション管理コードと結合しません。

また、これらすべてのものは、SpringFrameworkなどの一部のライブラリによってすでに実装されていることにも注意してください。おそらく、独自のソリューションを作成する代わりにそれを活用するか、少なくともそれらの設計を確認することができます(Springでは、接続を取得するためのさまざまなアプローチがそれぞれDataSourceUtilsとによって実装されてTransactionAwareDataSourceProxyいます)。

参照:

于 2012-07-11T08:47:19.117 に答える