我正在写一个数据访问层。我对管理系统中的连接感到困惑。 我知道.net使用连接池。但我不想在所有dml操作或所有sql查询中打开和关闭数据库连接。我怎么处理这个?何时何地(可能在使用数据访问层或数据访问层的全局asax中)应该管理连接?
答案 0 :(得分:11)
除非运行一批语句,否则应该为每个查询打开和关闭sql连接。
“开放较晚,提前关闭”是您应该始终处理数据库连接的方式。
如果你以传统的方式(自己进行查询),MS已经编写了一个很好的数据访问接口。数据的enterprise library(应用程序块)具有良好的良好形成的铃声和口哨声。
答案 1 :(得分:6)
为什么不想为每个离散逻辑操作打开/关闭连接?大多数现有的DAL都采用这种方式。通常,尝试超越运行时自动为您做的事情并不是一个好主意,例如智能地管理您的连接。在花费时间和精力为您的应用添加复杂性之前,您应该具有强大的,可证明的技术需求。
答案 2 :(得分:2)
作为交易必须发生的操作呢?
你的BL是否正确进行操作和逻辑/验证?
假设你有一个BL层
结果:客户无效。所以你必须回滚你的交易。
如何解决这个问题?
答案 3 :(得分:0)
连接管理不应由DAL管理。
可以负责/可以决定是应该打开新连接还是应该关闭连接的唯一层是使用DAL的服务层或应用层。 该层是唯一知道上下文的层,因此您可以决定是否应该关闭连接,或者让它保持打开状态,因为其他数据库通信应该使用相同的连接。
答案 4 :(得分:0)
您确实应该为每个操作打开/关闭。不要将Connection用作高成本操作,因为它根本不是。当您在站点上打开连接时,它们将在连接池中创建。当您“关闭”连接时,连接池不会释放连接:它将其保持在手,准备重用。因此,虽然导致新连接的第一次调用需要更长时间,但后续连接速度非常快。
更新:在Web应用程序中尤其如此! 不尝试在全局对象中只打开一次连接,并在所有线程中重复使用它,否则您的网站将无法正常工作。
答案 5 :(得分:0)
我在.Net中编写了几个数据层之后的建议(以及之前的VB6中的一些数据层)是:
我自己的最新基本DAL(没有ORM)花了我半个小时的时间来写,而且非常小巧 高效。 MS企业的东西是巨大的!!!
最后一件事 - 我个人认为从xsds生成的强类型数据集具有很高的烦恼(和膨胀)以获得比率 - 以及它们使你处理NULL sux的时间很长。您编写的所有使用它们的代码也很臃肿......或者您最终将它们向下转换为DataSet以实际获得高效,非重复代码库。
答案 6 :(得分:0)
我不清楚回答旧问题的礼节,我无法弄清楚如何评论另一个答案(我对SO来说是全新的,而我不是第一杯咖啡今天,所以给我一些松懈=])。
我总是编写DAL来打开/关闭每个查询的连接,让驱动程序的连接池完成连接管理工作。
但是,我有一个使用共享MS Access数据库的多用户桌面应用程序(在制作此应用程序时,SQL Express不是真正可用的形式),我偶尔会看到指示损坏的错误。 This MS article建议仅对整个应用使用一个连接:
“不建议反复打开和关闭Microsoft Access数据库。在应用程序开头打开数据库一次,然后在应用程序结束时关闭数据库。”
我的应用程序是多线程的,所以我假设我必须修改建议“打开一个连接PER THREAD”以避免冲突。有没有人有使用OLEDB共享Access数据库和类似腐败问题的经验?