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

如何处理数据访问层(.net)中的连接,.net,data-access-layer,.net,Data Access Layer,我正在写一个数据访问层。我对管理系统中的连接感到困惑。 我知道.net使用连接池。但我不想在所有dml操作或所有sql查询中打开和关闭数据库连接。我该怎么办?应在何时何地(可能在使用数据访问层的global asax中或在数据访问层中)管理连接?为什么不为每个离散逻辑操作打开/关闭连接?大多数现有的DAL都是这样的。通常,试图比运行时自动为您做的事情(例如智能地管理您的连接)更聪明不是一个好主意。在投入时间和精力为应用程序增加复杂性之前,您应该有强烈的、可证明的技术需求。您应该为每个查询打开和关

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

为什么不为每个离散逻辑操作打开/关闭连接?大多数现有的DAL都是这样的。通常,试图比运行时自动为您做的事情(例如智能地管理您的连接)更聪明不是一个好主意。在投入时间和精力为应用程序增加复杂性之前,您应该有强烈的、可证明的技术需求。

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

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

如果您是以传统的方式进行(进行自己的查询),MS已经编写了一个很好的数据访问接口。数据的(应用程序块)具有所有格式良好的铃铛和哨子


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

连接管理不应由DAL管理

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

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


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

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

  • 尽可能使用数据集而不是读卡器
  • 接通和断开连接(在任何一个连接上都不能打开>1个读卡器)
  • 使用后端上的参数化SP进行工作。 3.5确保所有表都有唯一的一个字段主键 有点不对劲

  • 使用代码生成(您的或购买的)来生成ORM类-但要注意它们不是全部(一次一个表的东西很方便-但可以让您编写丑陋低效的代码,在后端使用连接或狡猾的SP或视图进行查询会更好地完成这项工作)
  • 阅读连接对象的事务处理方法-非常方便(尽管一些需要事务处理的纯db事物(例如,存在关系的删除)应该在后端,也可以是事务
  • 我自己最新的基本DAL(无ORM)花了我半个小时来编写,它紧凑而漂亮 效率很高。微软enterprisey的东西是巨大的


    最后一件事——我个人认为,从XSD生成的强类型数据集非常麻烦(而且膨胀)获取比率——以及它们让您大量处理空sux的方式。您为使用它们而编写的所有代码都过于庞大……或者您最终将它们向下转换到数据集,以实际获得一个高效、非重复代码库。

    对于必须作为事务发生的操作,该怎么办

    是您的BL完成了操作和逻辑/验证,对吗

    假设你有一个BL层

  • 更新您的客户帐户信息。(DAL->更新客户记录)
  • 插入地址记录。(DAL->插入地址)
  • 根据第三个对象验证您的客户。(DAL->获取客户和地址&验证对象)
  • 结果:客户无效。因此您必须回滚您的交易


    如何着手解决这个问题?

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

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

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

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


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

    数据访问层不是数据库和所有其他代码之间的层吗?DAL是对数据库及其访问方式进行抽象的层。其他代码通过调用DAL可以执行查询,但DAL本身不能执行查询