【问题标题】:Java Dynamic Transaction Proxy - connection initializationJava 动态事务代理 - 连接初始化
【发布时间】:2012-07-10 19:05:31
【问题描述】:

我有这样的事情:
1) DAO 类 带有方法,用于执行事务,例如withdrawSum(int idAccount, float amount)putSum(int idAccount, float amount),它们使用 java.sql.Connection 和 java.sql.PreparedStatement 类对 DB 执行原子操作。 2) java.lang.reflect.InvocationHandler implementationor,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 的 invoke 方法。它应该如何在 DAO 方法中正确初始化?有任何想法吗?提前致谢。

【问题讨论】:

    标签: java reflection transactions


    【解决方案1】:

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

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

    • DAO 可以通过调用一些静态方法获得Connections

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

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

    另请参阅:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-11
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-27
      • 2012-06-26
      相关资源
      最近更新 更多