ADO.NET Connection使用问题(菜鸟)

roseaknight 2003-11-21 07:43:58
各位大虾:
我有一个ADO.NET Connection对象的使用问题。每次数据访问connection对象必然打开。访问之后应该关闭。可是频繁的打开和关闭必然导致性能的下降。比如想通过一个ID号得到学生的用户名。如果要对100个学生这样操作的话,需要200次打开和关闭。用select语句把ID和用户名的列表得到也可以,但是这样导致这个访问的操作无法重用。所以,我疑惑:是把connection操作放到数据访问模块以外,还是放在内部。放在外面的好处是:外部控制程序负责connection,可以减少访问模块的访问次数。但是coupling程度高。放在里面:实现细节隐藏了,但是需要频繁打开和关闭。
另外有没有数据连接池一类的东西?
多谢
...全文
41 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
roseaknight 2003-11-26
  • 打赏
  • 举报
回复
http://www.aspcool.com/lanmu/browse1.asp?ID=1076&bbsuser=csharp
This paper could be helpful
yaotiebing 2003-11-21
  • 打赏
  • 举报
回复
数据库链接池使应用程序能够重用池中的现有链接,而不是重复地建立对数据库的链接。这种技术将极大地增加应用程序的可伸缩性,因为有限的数据库链接可以为很多的客户提供服务。此技术也将提高性能,因为能够避免用于建立新链接的巨大时间。

数据访问技术,如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数据提供程序,那么就可使用该提供程序提供的链接池化支持特性。它是由提供程序在托管代码内内置实现的对事务敏感的高效机制。每个过程都将创建池,并且直到过程结束,池才被取消。

你可以透明地使用此种链接池,但应当清楚池是如何被管理的,并要知道可以用哪些选项来调整链接池。

alphaqxm 2003-11-21
  • 打赏
  • 举报
回复
SqlConnection.Close() 和Open() 是释放资源到连接池或者从连接池获得资源。这个操作的开销其实是很小的。
roseaknight 2003-11-21
  • 打赏
  • 举报
回复
当然,好的策略是尽量一次取得所需的数据。但是问题是这样做会使某个方法变得庞大,方法之间的coupling严重上升。tradeoff啊
roseaknight 2003-11-21
  • 打赏
  • 举报
回复
SqlConnection.Close() 和Open() 是释放资源到连接池或者从连接池获得资源。但是也要开销吧。如果访问数据的频度很高,这个开销也不小吧。
roseaknight 2003-11-21
  • 打赏
  • 举报
回复
一次读入许多数据到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层就比较好。这样也可以比较快地释放连接资源。

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

我读的文章还少,也许已经有很好的解决方案了。请大家指点。如果没有,大家一起讨论一下。
kenny 2003-11-21
  • 打赏
  • 举报
回复
是啊,應該充分利用DataSet和DataTable給我們帶來的優越性。
91bct 2003-11-21
  • 打赏
  • 举报
回复
你可以一次把所有的学生的信息全部取到本地,然后在本地过滤,
这样可以减少对数据库的访问频率,不管使用不使用连接池,这都有利于系统的效率。
saucer 2003-11-21
  • 打赏
  • 举报
回复
>>可是频繁的打开和关闭必然导致性能的下降

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


62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧