Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java DAO层内的JDBC连接_Java_Jdbc_Concurrency_Dao - Fatal编程技术网

Java DAO层内的JDBC连接

Java DAO层内的JDBC连接,java,jdbc,concurrency,dao,Java,Jdbc,Concurrency,Dao,你好, 我尝试创建DAO层,主要如下所示。 请注意,我不使用任何框架,只使用普通的JDBC 看看如何创建连接实例: 在每个CRUD方法中,我们通过以下方式获得连接: Connection connection = daoFactory.getConnection(); 因此,每次调用方法时,我们都会获得一个新的连接。 我唯一的问题是如何在这里实现事务 我看到两种解决办法: 我使用Connection字段,而不是DaoFactory字段,我在方法之间共享它。以便每个DAO有一个连接。但是,哪一层

你好,
我尝试创建DAO层,主要如下所示。
请注意,我不使用任何框架,只使用普通的JDBC

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

Connection connection = daoFactory.getConnection();
因此,每次调用方法时,我们都会获得一个新的连接。
我唯一的问题是如何在这里实现事务
我看到两种解决办法:

  • 我使用Connection字段,而不是DaoFactory字段,我在方法之间共享它。以便每个DAO有一个连接。但是,哪一层应该负责事务?我应该在Service-DAO之间创建一些东西吗
  • 我为创建事务所需的其他DAO实例创建字段。例如,我会让TransactionDao实现banktransfer(从一个用户取钱并添加到另一个用户),而这个TransactionDao也会有UserDao,因为我应该执行一个create和两个update操作
  • 我想知道正确的解决方案,也许不是上面提到的。
    请告诉我是否有任何我应该担心的并发问题?

    谢谢

    最简单的解决方案是始终在单个DAO方法中执行事务,在方法开始时获取连接,并将其传递给运行SQL的其余方法,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(连接,transaction.getReceiver())
    accountDao.update(连接,transaction.getSender())
    。哪一部分是不好的做法?您正在Dao之间传递连接吗?我肯定是的,但我通常不会听别人说正确的、简单的代码是不好的做法。