gpt4 book ai didi

Java动态事务代理-连接初始化

转载 作者:行者123 更新时间:2023-12-01 15:17:32 25 4
gpt4 key购买 nike

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

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) 事务管理器,它创建 Proxy 实例并在其帮助下调用执行事务的方法,如下所示:

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 对象。它被初始化并传递给 InvocableHandler 的 invoke 方法。如何在 DAO 方法中正确初始化它?有任何想法吗?提前致谢。

最佳答案

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

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

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

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

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

另请参阅:

关于Java动态事务代理-连接初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11427985/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com