DAO 层内的 JDBC 连接
Posted
技术标签:
【中文标题】DAO 层内的 JDBC 连接【英文标题】:JDBC Connection inside DAO layer 【发布时间】:2017-06-08 09:51:42 【问题描述】:美好的一天, 我尝试创建 DAO 层,主要关注this guide。 请注意,我不使用任何框架,只使用普通 JDBC。
看看创建一个连接实例: 在每个 CRUD 方法中,我们通过以下方式获取连接:
Connection connection = daoFactory.getConnection();
所以我们每次调用方法时都会获得一个新的连接。 我唯一的问题是如何在这里实现交易? 我看到了两种解决方案:
-
我使用 Connection 字段代替 DaoFactory 字段,我在方法之间共享该字段。以便每个 DAO 有一个连接。但是,应该由哪一层来负责事务呢?我应该在 Service - DAO 之间创建一些东西吗?
我为创建事务所需的其他 DAO 实例创建字段。因此,例如,我会让 TransactionDao 实现银行转账(从一个用户那里取钱并添加到另一个用户),这个 TransactionDao 也将有 UserDao,因为我应该进行一个创建和两个更新操作。
我想知道正确的解决方案,也许上面没有提到。 请告诉我还有什么我应该担心的并发问题吗? 谢谢
【问题讨论】:
我建议你阅读这个***.com/questions/12812256/…这可能会帮助你回答你自己的问题。 【参考方案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())
。
哪一部分是不好的做法?那你是在传递道之间的联系吗?我敢肯定,但我通常不听那些告诉我正确、工作简单的代码是不好的做法的人。以上是关于DAO 层内的 JDBC 连接的主要内容,如果未能解决你的问题,请参考以下文章