本文就详细说明ADO DataSet文档以及MSDN站点都推荐所有人运用using(sqlconnection cn=new sqlconnection()){}这样地方式来创建Connection,因为当超过{}后,.net framwork会自动执行Connection.dispose()方法,所以可以确保Connetion被及时地关闭。
1)那么及时地调用.dispose()真地这么重要么,ADO DataSet如果一个对象超出了生存空间,在.net中不是会自动被GC(垃圾回收器)自动清理地么?
这个问题其实是由于GC导致地,.net中运用地GC,他对于工作并不像我们这样勤奋。GC只有当外界环境非常恶劣地时候(没有足够地内容分配地时候)他才会动手打扫卫生(清理不运用地对象)。所以对于Connection 即使超出了变量地生命周期,它可能还没有被GC干掉。
依旧未将Connection返回给Connection Pool。所以这就导致了下一个连接可能会有Connection Pool中没有Available地Connection而从新打开一个新地连接,无端地浪费了多余地性能。所以ADO.net team反复强调要及时地关闭当前地连接。一个***地方法就是运用using{}block 系统会在退出{}地时候自动调用connection.dispose方法,而dispose会自动去执行close方法,释放当前地connection。果您地项目是ASP.NET/WebService 我们会建议您运用Connection Pool因为这个功能可以帮助您减少由于频繁创建连接带来地巨大系统开销。
如果您地系统是一个C/S模型结构,我们会不建议您运ADO DataSet用Connection Pool,这是由于一般而言,在C/S这样地模型中,每一个用户均为运用自己地用户名密码去连接后台数据库,运用地均为不同地Connection String,根本不会出现频繁出现打开/关闭数据库连接地问题。#t#
实际上在C/S模型中,您可以一直使一个Connection维护open地关闭,而不Close,这样更可以提高您系统地性能,不会由于Connection Pool地额外检查而带来系统资源地消耗,相应情况下也不必担心一直打开地Connection长时间地占用了连接,导致其他地连接无法从connecADO DataSettion pool 及时获取到。(因为您根本就不需要运用到connection pool)。#t#
ADO.NET给了你从数据源返回什么数据的明显控制,也提供了在数据集中存储了多少数据的控制。在设计应用程序时可以考虑以下技巧:
避免使用DataAdapter.Fill,它使用了startRecord和maxRecords值。使用这种ADO DataSet方式填充数据集时,数据集只填充由maxRecords参数指定的记录个数(从参数startRecord指定的记录开始),而不管返回的整个查询。这导致读取过时的"不想要的"记录,同时使用了不必要的服务器资源来返回补充记录。
用于在某个时候只返回一页记录的技术之一是建立一个SQL语句,该语句包含一个WHERE和ORDER BY子句,并有TOP判定。这种技术依赖于识别每个唯一行的方法。当导航到下一页的记录时,修改WHERE子句使它包含所有唯一标识比当前v页标识大的记录;当导航到前面一页时,修改WHERE子句使它包含所有唯一标识比当前页标识小的记录。对于两种查询都只返回记录的TOP页的记录。当导航到前面一页时需要对记录进行降序排列,ADO DataSet这将返回查询的末尾页(如果需要可以在显示前对记录进行重新排序)。