DAO中的数据一致性



查找"dao数据一致性";或";数据访问层数据一致性";在谷歌上没有返回任何有用的

假设我必须编写使用SQL数据库作为数据源的DAO,假设我的模式强制执行大多数(但不是全部(业务数据(?(规则,如非空用户名等。但对于那些几乎不可能使用DDL检查或其他SQL机制进行检查的规则,则不强制执行。

这意味着我的DAO必须确保数据一致性吗;愚蠢的";并期望呼叫者进行适当的检查?

SQL的实际示例:此模式有2个表

create table bank_accounts
(
accid int primary key,
balance int not null default 0,
check(balance >= 0)
);
create table transfer
(
tid int primary key,
senderaccid int not null, 
receiveraccid int not null,
sendercurrentbalance int not null,
receivercurrentbalance int not null,
amount int not null, 
check(amount > 0),
foreign key (senderaccid) references bank_accounts(accid),
foreign key (receiveraccid) references bank_accounts(accid)

);

SQL中的典型交易将基于该金额更新2个账户余额,并在CCD_;我应该有DAO吗?例如,让我在transfer中插入一条记录,而不必进行实际的帐户余额更新,或者我应该只有类似事务的DAO(通过使用java.sql API的connection.setAutoCommit(false(等(,甚至可能做数据库无法确保的数据一致性的事情,以确保应用程序要求所指定的数据一致?

附言:如果我想用木槌作为扳手,那是因为它是大学项目的一部分,要求我们学生在不使用任何新奇的新框架或API 的情况下,以良好的方式完成它

出于我个人纯粹的实践经验(这听起来可能与其他开发人员的经历类似(:我总是让DAO方法简单而愚蠢:它们在生活中的唯一目的是从数据库中获取数据(或存储/删除/更新(数据库中的一些数据。

我不喜欢DAO中的逻辑(if条件、for循环、对其他类的委托等(。为了回答为什么我实际上更喜欢这种方法,让我先解释一下我实际做了什么,然后进行比较:

所以,我通常至少将代码划分为3层:

  • 端点(通过web、消息系统等处理传入请求(-这里没有特殊的逻辑,可能只是简单的验证。这一层相对简单
  • 后端服务-这是后端的所有逻辑所在,包括各种非琐碎的检查、算法等
  • DAO-类似于";端点";但这次是在DB互连的级别

当然,服务层是最难实现的,但它没有任何";外部";依赖关系,如数据库、远程http服务等。我们向该层输入一些数据,它处理数据,有时通过定义良好和封装的点中的DAO调用DB。

这反过来又允许对服务层进行相对简单的测试(通常使用单元测试(

现在对于DAO来说,它的测试工作更为复杂(如果没有实际的DB,你将如何检查查询是否正确(?因此,如果我将在DAO层引入逻辑,我将添加2个主要问题(我想不出来,可能还有更多问题(:

  • 一些逻辑将在DAO级别,而其他逻辑(如复杂的检查(将在服务层。因此,它使代码变得更加混乱,更难理解/导航/维护/你能想到的。还想一想,如果有一天我想用其他东西代替我的数据库会怎么样。如果我将逻辑保留在DAO中,我将不得不以某种方式重新实现这个逻辑,而如果我保持DAO简单,我只需重写查询,这样做更容易、更快
  • 我如何测试那些具有";找到了他们的路";到DAO层?就性能而言,DAO通常需要集成测试,这比";常规的";单元测试。因此,我现在必须为DAO维护更多的集成测试,这将导致整个应用程序构建过程变慢(测试是在构建过程中运行的(

最新更新