DAO层内的JDBC连接

时间:2017-01-23 19:16:49

标签: java jdbc concurrency dao

美好的一天,
我尝试创建DAO层,主要是this guide 请注意,我不使用任何框架,只需简单的JDBC。

看一下创建一个Connection实例:
在每个CRUD方法中,我们通过以下方式获得连接:

Connection connection = daoFactory.getConnection();

因此,每当我们调用方法时,我们都会获得一个新连接 我唯一的问题是如何在这里实现交易?
我看到两个解决方案:

  1. 我使用Connection字段代替DaoFactory字段,我在这些方法中分享。这样每个DAO就有一个连接。但那么,什么层应该负责交易?我应该在Service - DAO之间创建一些东西吗?
  2. 我为创建事务所需的其他DAO实例创建字段。因此,好像,例如,我会让TransactionDao实现银行转账(从一个用户拿钱并添加到另一个用户),这个TransactionDao也会有UserDao,因为我应该进行一次创建和两次更新操作。
  3. 我想知道正确的解决方案,也许它不是上面提到的 请告诉我,是否还有我应该担心的并发问题? 谢谢

1 个答案:

答案 0 :(得分: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();
}