DAO层中的JDBC连接

3

你好,
我尝试创建DAO层,主要遵循这个指南
请注意,我没有使用任何框架,只使用纯JDBC。

看一下创建连接实例的方法:
在每个CRUD方法中,我们按照以下方式获取连接:

Connection connection = daoFactory.getConnection();

每次调用方法时,我们都会获得一个新的连接。 我唯一的问题是如何在此处实现事务?我看到两个解决方案:
  1. 使用连接字段而不是DaoFactory字段,将其共享在方法之间,以便每个DAO只有一个连接。 但是,哪一层应该负责事务? 我应该在Service - DAO之间创建某些内容吗?
  2. 为其他需要创建事务的DAO实例创建字段。 所以,例如,我将TransactionDao用于实现banktransfer(从一个用户中取款并添加到另一个用户),并且此TransactionDao还将具有UserDao,因为我应该进行一个创建和两个更新操作。
我想知道正确的解决方案,也许以上提到的都不是。 请告诉我还有哪些并发问题需要担心? 谢谢。

当我看到人们投票关闭一个完全合理的问题,尤其是由新用户提出时,我的愤怒之情无以言表。 - MK.
我建议您阅读此文:https://dev59.com/62cs5IYBdhLWcg3wfD9P?answertab=oldest#tab-top 这可能有助于您回答自己的问题。 - fabfas
1个回答

1
最简单的解决方案是始终在单个DAO方法中执行事务,在该方法的开始获取连接并将其传递给需要成为此事务一部分的其余方法运行的SQL。 我不建议您自己开发这种简单方法的替代方案。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();
}

谢谢,我只是想编辑我的帖子并贴上类似的代码来确认是否理解您的意思。最后一个问题。我可以将incBalance封装到AccountDao中,并在TransactionDao中使用此字段吗?这不会是一种不好的做法吗?因此,我的代码将会像 accountDao.update(connection, transaction.getReceiver())accountDao.update(connection, transaction.getSender()). - Sabine
哪一部分是不好的实践?是你在 Dao 之间传递连接吗?我相信它是不好的实践,但通常我不会听那些告诉我正确、可工作的简单代码是不好的实践的人。 - MK.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接