0

我有这样的东西:
1)带有方法的DAO类,用于执行事务,例如使用java.sql.ConnectionwithdrawSum(int idAccount, float amount)putSum(int idAccount, float amount)java.sql.PreparedStatement类对DB执行原子操作。
2) java.lang.reflect。InvocationHandler实现者,whick 用于在事务前获取连接和事务后提交/回滚:

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的调用方法。它应该如何在 DAO 方法中正确初始化?有任何想法吗?提前致谢。

4

1 回答 1

1

由于事务自然与线程相关联,因此这里的典型方法是在事务范围内存储Connection在存储中。ThreadLocal

然后,您可以使用不同的方法使这些连接对 DAO 可用:

  • DAO 可以Connection通过调用一些静态方法来获取 s

  • 可以将自定义DataSource注入 DAO - 它的getConnection()方法将返回与当前事务关联的连接,请注意连接应该被代理以便忽略close()。这种方法不会将您的 DAO 与事务管理代码结合起来。

另请注意,所有这些东西都已由某些库实现,例如 Spring Framework。也许您可以利用它而不是创建自己的解决方案,或者至少看看他们的设计(在 Spring 中,获取连接的不同方法分别由DataSourceUtils和实现TransactionAwareDataSourceProxy)。

也可以看看:

于 2012-07-11T08:47:19.117 回答