如何处理数据访问层(.net)中的连接

时间:2009-01-28 13:03:43

标签: .net data-access-layer

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

7 个答案:

答案 0 :(得分:11)

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

“开放较晚,提前关闭”是您应该始终处理数据库连接的方式。

如果你以传统的方式(自己进行查询),MS已经编写了一个很好的数据访问接口。数据的enterprise library(应用程序块)具有良好的良好形成的铃声和口哨声。

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

答案 1 :(得分:6)

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

答案 2 :(得分:2)

作为交易必须发生的操作呢?

你的BL是否正确进行操作和逻辑/验证?

假设你有一个BL层

  1. 更新您的客户帐户信息。 (DAL - >更新客户记录)
  2. 插入地址记录。 (DAL - >插入adres)
  3. 根据第三个对象验证您的客户。 (DAL - >获取客户端& adres&验证对象)
  4. 结果:客户无效。所以你必须回滚你的交易。

    如何解决这个问题?

答案 3 :(得分:0)

连接管理不应由DAL管理。

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

我在.Net中编写了几个数据层之后的建议(以及之前的VB6中的一些数据层)是:

  1. 尽可能使用数据集而不是读者。
  2. 建立和断开连接(不能在任何一个连接上打开> 1个读卡器。)
  3. 在后端使用paramaterised sps进行工作。 3.5确保所有表都有一个唯一的单字段主键!
  4. 有点OT?...

    1. 使用代码生成(你的或买进来)来生成ORM类 - 但要注意它们不是be-all和end all(一次一个表的东西很方便 - 但是可以让你写出丑陋的无效代码其中一个带有连接或狡猾的SP或视图的后端查询将更好地完成工作。)
    2. 读取Connection对象的Transaction方法 - 非常非常方便(虽然一些纯粹需要事务的db事物(例如有关系的删除)应该是后端的事务。
    3. 我自己的最新基本DAL(没有ORM)花了我半个小时的时间来写,而且非常小巧 高效。 MS企业的东西是巨大的!!!

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

答案 6 :(得分:0)

我不清楚回答旧问题的礼节,我无法弄清楚如何评论另一个答案(我对SO来说是全新的,而我不是第一杯咖啡今天,所以给我一些松懈=])。

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

但是,我有一个使用共享MS Access数据库的多用户桌面应用程序(在制作此应用程序时,SQL Express不是真正可用的形式),我偶尔会看到指示损坏的错误。 This MS article建议仅对整个应用使用一个连接:

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

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