2

我正在编写一个数据访问层。我对管理系统中的连接感到困惑。我知道.net 使用连接池。但我不想在所有 dml 操作或所有 sql 查询中打开和关闭数据库连接。我该如何处理?应该在何时何地(可能在使用数据访问层或数据访问层的全局 asax 中)管理连接?

4

7 回答 7

11

您应该为每个查询打开和关闭 sql 连接,除非您正在运行一批语句。

“迟开早关”是您应该始终处理数据库连接的方式。

如果您以传统方式(进行自己的查询)进行处理,MS 已经编写了一个不错的数据访问接口。用于数据的企业库(应用程序块)具有所有格式良好的花里胡哨。

如果您不想费心编写查询,我建议您查看linq2Sqllinq2EF(首选)。它们将大大简化您的编码。

于 2009-01-28T13:10:35.953 回答
6

为什么不想为每个离散逻辑操作打开/关闭连接?大多数现有的 DAL 都以这种方式运行。通常,尝试超越运行时自动为您做的事情并不是一个好主意,例如智能地管理您的连接。在投入时间和精力将这种复杂性添加到您的应用程序之前,您应该有一个强大的、可证明的技术需求。

于 2009-01-28T13:08:00.280 回答
2

必须作为事务发生的操作呢?

是您的 BL 负责操作和逻辑/验证吗?

假设你有一个 BL 层

  1. 更新您的客户帐户信息。(DAL -> 更新客户记录)
  2. 插入地址记录。(DAL -> 插入地址)
  3. 根据第三个对象验证您的客户。(DAL -> 获取客户端、地址和验证对象)

结果:客户无效。所以你必须回滚你的交易。

如何解决这个问题?

于 2009-01-29T14:47:10.883 回答
0

我不清楚回答老问题的礼仪,我不知道如何评论另一个答案(我对 SO 是全新的,我今天还没有喝完第一杯咖啡,所以让我放松一下=])。

我总是编写我的 DAL 来打开/关闭每个查询的连接,并让驱动程序的连接池完成连接管理工作。

但是,我有一个使用共享 MS Access DB 的多用户桌面应用程序(创建此应用程序时,SQL Express 并没有以真正可用的形式出现),并且我偶尔会看到指示损坏的错误。 这篇 MS 文章建议对整个应用程序仅使用一个连接:

“不建议重复打开和关闭 Microsoft Access 数据库。在应用程序开始时打开数据库一次,然后在应用程序结束时关闭数据库。”

我的应用程序是多线程的,所以我假设我必须修改建议以“每个线程打开一个连接”以避免冲突。有没有人有使用共享 Access 数据库与 OLEDB 和类似损坏问题的经验?

于 2009-09-16T17:59:37.943 回答
0

连接管理不应由 DAL 管理。

唯一可以负责/可以决定是否应该打开新连接或关闭连接的层是使用​​ DAL 的服务层或应用程序层。该层是唯一了解上下文的层,因此您可以在该层决定是否应该关闭连接,或者将其保持打开状态,因为其他数据库通信应该使用相同的连接。

于 2009-01-28T13:15:20.357 回答
0

您确实应该为每个操作打开/关闭。不要将连接使用视为高成本操作,因为它根本不是。当您在站点上打开连接时,它们将在连接池中创建。当您“关闭”连接时,连接池不会释放连接:它保持在手边,准备重用。因此,虽然导致新连接的第一次调用需要更长的时间,但后续连接非常快。

更新:在 Web 应用程序中尤其如此!不要尝试在全局对象中只打开一次连接在所有线程中重复使用它,否则您的站点将无法正常工作。

于 2009-01-28T13:18:17.060 回答
0

在 .Net 中编写了几个数据层(之前在 VB6 中编写了更多数据层)后,我的建议是:

  1. 尽可能使用数据集而不是阅读器。
  2. 建立和断开连接(无论如何,您都不能在任何一个连接上打开 >1 个阅读器)。
  3. 在后端使用参数化的 sps 进行工作。3.5 确保所有表都有唯一的单字段主键!

有点OT?...

  1. 使用代码生成(您的或购买的)来生成 ORM 类 - 但请注意,它们不是全部和全部(一次一张表的东西很方便 - 但可以让您编写丑陋的低效代码,其中一个查询在后端使用连接或狡猾的 SP 或视图会更好地完成工作)。
  2. 阅读 Connection 对象的 Transaction 方法 - 非常非常方便(尽管一些需要事务的纯数据库事物(例如,存在关系的删除)应该是后端的事务。

我自己最新的基本 DAL(无 ORM)花了我半个小时来编写,并且非常紧凑且非常高效。MS 企业的东西是巨大的!

最后一件事——我个人认为从 xsds 生成的强类型数据集对增益率有很高的烦恼(和膨胀)——以及它们让你处理 NULL sux 的方式很重要。您为使用它们而编写的所有代码也很臃肿......或者您最终将它们向下转换为 DataSet 以实际获得一个高效、非重复代码库。

于 2009-01-28T13:30:19.283 回答