繁体   English   中英

在3层系统中正确抽象数据库层?

[英]Proper abstraction of the database tier in a 3 tier system?

我正在创建一个3层应用程序。 基本上就是这样

客户端 - >(通过可选服务器成为瘦客户端) - >业务逻辑 - >数据库层

而且基本上是为了让它永远不会跳过。 因此,我希望所有的SQL查询都在数据库层中。

好吧,现在我有点困惑。 我做了一些静态类来启动数据库层,但是我应该怎么做数据库连接? 我是否应该在进入数据库层时创建新的数据库连接,还是浪费? 每当有ConnectionPool时,Connection.Open()是否需要时间?

对我而言,业务层必须将IdbConnection对象传递给数据库层才感觉不对。 似乎数据库层应该处理所有特定于DB的代码。 你怎么看? 如何在保持实用的同时以正确的方式做到这一点?

只在需要时打开连接。 不要保持与数据库的连接,这样会更加浪费。 当然你的数据库层将打开连接,我不知道为什么你认为BLL将传递连接到数据库。 BLL不知道数据库(至少它不应该),它应该处理业务规则等。 实际连接在db层打开。

这是一个显示BLL应该如何显示的链接:

验证.net中的数据

连接字符串本身应该只是db层类中的私有字符串变量,您应该能够从web.config文件中提取连接字符串信息。

您可以创建一个类(或类的命名空间,具体取决于大小)来托管数据库层。 在数据库类中,您应该只在数据库层中使用连接池。 在任何给定时间,池将保持n个连接对数据库开放,因此您可以使用其中一个池连接运行查询,而不会产生大量开销。

有了这个,您的数据库层应该呈现业务层可以调用的公共方法的“API”。 这些方法都不应公开数据库连接对象 - 这些细节是数据层内部的。

然后,从业务层,每次需要运行查询时,只需调用数据库层的“API”。

这有帮助吗?

每次进入数据库层时都可以创建并打开一个新连接,并在完成连接后立即关闭连接。 .Net / Sql Server可以很好地处理连接池,使其工作,这是可以接受的方式。

您也没有从业务层传递连接字符串。 这应该是数据层的私有(但可配置)成员。

传统上,单独的“数据访问层”提供用于检索和提交数据的数据库上下文。 有几种众所周知的模式,例如Repository。 ADO.NET实现了其他几个,例如Provider。

实体框架和LINQ to SQL也是进一步封装和简化数据层隔离的好选择。

由于ConnectionPool,每次访问db时打开一个新连接通常都不是问题。

如果您可以重复使用开放连接而不会让连接长时间打开,并且没有留下孤立的打开连接的风险 ,那么重用打开的连接并不会有害。 (我实际上将一个数据工具注入我访问数据库的所有类中。这主要用于单元测试目的,但它也允许我选择保持连接打开以供多次调用db使用。)

但同样,你不应该过多地强调打开/关闭很多连接。 你的DAL 更重要

  • 可维护,简单,灵活
  • 尽可能地表现
  • (最重要的是)始终妥善处理它的连接。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM