当前位置: 首页 > 知识库问答 >
问题:

DAO层内部的JDBC连接

胡飞鹏
2023-03-14

早安,
我尝试创建DAO层,主要遵循以下指南<请注意,我不使用任何框架,只使用普通的JDBC。

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

Connection connection = daoFactory.getConnection();

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

  1. 我使用连接字段,而不是DaoFactory字段,我在方法之间共享连接字段。以便每个DAO有一个连接。但是,哪一层应该负责事务?我应该在服务和DAO之间创建一些东西吗

我想知道正确的解决方案,也许不是上面提到的
请告诉我还有什么并发问题需要我担心吗<谢谢

共有1个答案

缪征
2023-03-14

最简单的解决方案是始终在单个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();
}
 类似资料:
  • LocallyConnected1D层 LocallyConnected2D层

  • LocallyConnected1D层 keras.layers.local.LocallyConnected1D(nb_filter, filter_length, init='uniform', activation='linear', weights=None, border_mode='valid', subsample_length=1, W_regularizer=None, b_re

  • LocallyConnected1D层 keras.layers.local.LocallyConnected1D(filters, kernel_size, strides=1, padding='valid', data_format=None, activation=None, use_bias=True, kernel_initializer='glorot_uniform', bias_

  • 在我的示例中,我有一个Hibernate实体和一个DAO。 当我以这种方式使用DAO时 数据库中只保存了一行(Action2)。当我删除注释时,两行(Action1和Action2)都被保存(这是我需要的行为)。我的问题是服务层上的事务注释如何影响事务(方法executeTransaction())的执行。为什么没有服务层上的事务性注释,这两行都保存在数据库中,而只有最后一行与此注释一起保存?

  • 我有一个pyspark数据帧(df1 ),它由10K行组成,数据帧看起来像- 另一个pyspark数据帧(df2)由100k记录组成,看起来像- 我想使用pyspark内连接,最终的数据帧看起来像- df2中mobile_no的长度是12,但df1中是10。我可以加入它,但这是昂贵的操作。使用pyspark有帮助吗?

  • 问题内容: 我的问题如下。我需要一个类,该类可以作为指向Web系统中数据库连接的单点,以免让一个用户拥有两个打开的连接。我需要使其尽可能最佳,并且应该管理系统中的每个事务。换句话说,只有该类才能实例化DAO。为了使它更好,它还应该使用连接池!我该怎么办? 问题答案: 您将需要实现 DAO管理器 。我从这个网站获得了主要思想,但是我做了自己的实现,解决了一些问题。 首先,您必须配置一个 连接池 。连