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 连接的主要内容,如果未能解决你的问题,请参考以下文章

Java Dao模式通过JDBC连接数据库的操作

在 Hibernate 的 SessionFactory 和 JDBC DAO 之间共享连接的最佳方式是啥?

JDBC—DAO

java 关于JDBC和DAO模式使用

JDBC—DAO

Spring DAO模块