>>可是频繁的打开和关闭必然导致性能的下降don't just guess, do some profiling or monitoring>>需要200次打开和关闭not true, if you are using connection pooling, which should be the default>>这个访问的操作无法重用if the data is mostly readonly, consider to do one SELECT and cache the information on the server

解决方案 »

  1.   

    是啊,應該充分利用DataSet和DataTable給我們帶來的優越性。
      

  2.   

    连接池是缺省机制,但是是服务器层的支持。可是,在程序层面上还是要显示地open 和close,这必然有开销。频繁打开和关闭对性能的影响,我认为是显然的。
    现在大部分的web应用都有分层的概念。数据库访问都被包装到一个或多个访问类(component)中去了。可是connection对象由谁来管理? 我查看了asp.net上commerce starter的原码,发现:每个方法都自行打开和关闭数据库连接。这样做非常模块化,但是open和close的操作会很多。
    我想过是不是可以把数据访问模块在application变量中初始化,然后由所有有关page共享。这样只要引用一下就好了,数据连接只要打开一次。但是要处理好同步问题。
    还有一种方式,是把数据访问服务化。也就是说从IIS运行就一直存在,也是可以打开一次,一起共享。如果用web service实现,代价是不是太大了,毕竟使用的业务逻辑和数据访问都在一台机器上,用XML转来转去的耗费资源。
    有没有更好的方式实现业务层和数据访问层的交互,从而保证灵活,资源共享,减少开销。我读的文章还少,也许已经有很好的解决方案了。请大家指点。如果没有,大家一起讨论一下。
      

  3.   

    关于连接池,比如:SqlConnection.Close() 你以为是真的断开啦?其实是它将连接释放到连接池,除非在连接池被禁用的情况下才关闭连接.
      

  4.   

    一次读入许多数据到dataset的方式很好,但是实际上也只是使用一次,不能被多个logic或页面共享,而且模块化比较差。Duwamish 7.0 CS 书店好像使用dataset,不过也是在由各个data access模块自己打开资源。它没有自动关闭资源,而是由disposable方法自动关闭。也就是去掉引用,让gc回收。我没有仔细研究data access,但是看上去不是共享的和常驻的,好像是由页面逻辑创建。但是有一个变化,在每个data access component实例内,可以共享连接。也就是说在每个data access实例初始化的时候,连接被固化。只要这个data access继续被使用,连接就不关闭,直到它被dispose。
    我感觉这是一个比较好的方案。比较折衷。如果让所有的data access component共享同一个连接,coupling太高。如果让每个方法自己管理连接,太多open和close。 把连接管理放在二者之间,也就是data access component层就比较好。这样也可以比较快地释放连接资源。大家的看法呢?
      

  5.   

    SqlConnection.Close() 和Open() 是释放资源到连接池或者从连接池获得资源。但是也要开销吧。如果访问数据的频度很高,这个开销也不小吧。
      

  6.   

    当然,好的策略是尽量一次取得所需的数据。但是问题是这样做会使某个方法变得庞大,方法之间的coupling严重上升。tradeoff啊
      

  7.   

    SqlConnection.Close() 和Open() 是释放资源到连接池或者从连接池获得资源。这个操作的开销其实是很小的。
      

  8.   

    数据库链接池使应用程序能够重用池中的现有链接,而不是重复地建立对数据库的链接。这种技术将极大地增加应用程序的可伸缩性,因为有限的数据库链接可以为很多的客户提供服务。此技术也将提高性能,因为能够避免用于建立新链接的巨大时间。 数据访问技术,如ODBC和OLE DB,提供了多种形式的链接池,它们可配置到不同级别上。这两种方式对数据库客户端应用程序来说都是透明的。OLE DB链接池经常被称为会话或资源池。 关于微软数据访问组件(MDAC)中池的一般讨论,见http://msdn.microsoft.com/library/en-us/dnmdac/html/pooling2.asp。 ADO.NET数据提供程序提供了透明的链接池,每种链接池的确切机制对每种提供程序来说是不同的。本节讨论的链接池是关于: SQL Server .NET数据提供程序 (http://msdn.microsoft.com/library/en-us/dnbda/html/daag.asp) 
    OLE DB .NET数据提供程序  (http://msdn.microsoft.com/library/en-us/dnbda/html/daag.asp) 
    用SQL Server .NET 数据提供程序池化 如果正在使用SQL Server .NET数据提供程序,那么就可使用该提供程序提供的链接池化支持特性。它是由提供程序在托管代码内内置实现的对事务敏感的高效机制。每个过程都将创建池,并且直到过程结束,池才被取消。 你可以透明地使用此种链接池,但应当清楚池是如何被管理的,并要知道可以用哪些选项来调整链接池。 
      

  9.   

    http://www.aspcool.com/lanmu/browse1.asp?ID=1076&bbsuser=csharp
    This paper could be helpful