一返回多个数据集
检查你的访问数据库的代码看是否存在着要返回多次的请求每次往返降低了你的应用程序的每秒能够响应请求的次数通过在单个数据库请求中返回多个结果集可以减少与数据库通信的时间使你的系统具有扩展性也可以减少数据库服务器响应请求的工作量
如果你是用动态的SQL语句来返回多个数据集那我建议你用存储过程来替代动态的SQL语句是否把业务逻辑写到存储过程中这个有点争议但是我认为把业务逻辑写到存储过程里面可以限制返回结果集的大小减小网络数据的流量在逻辑层也不用在过滤数据这是一个好事情
用SqlCommand对象的ExecuteReader方法返回一个强类型的业务对象再调用NextResult方法来移动数据集指针来定位数据集示例一演示了一个返回多个ArrayList强类型对象的例子只从数据库中返回你需要的数据可以大大的减小你的服务器所耗用的内存
二对数据进行分页
ASPNET的DataGrid有一个非常有用的功能分页如果DataGrid允许分页在某一时刻它只下载某一页的数据另外它有一个数据分页的济览导航栏它让你可以选择浏览某一页而且每次只下载一页的数据
但是它有一个小小的缺点就是你必须把所有的数据都绑定到DataGrid中也就是说你的数据层必须返回所有的数据然后DataGrid再根据当前页过滤出当前页所需要的数据显示出来如果有一个一万条记录的结果集要用DataGrid进行分页假设DataGrid每页只显示条数据那就意味着每次请求都有条数据都是要丢弃的每次请求都要返回这么大的数据集对应用程序的性能影响是非常大的
一个好的解决方案是写一个分页的存储过程例子是一个用于对Northwind数据库orders表的分页存储过程你只需要传当前页码每页显示的条数两个参数进来存储过程会返回相应的结果
在服务器端我专门写了一个分页的控件来处理数据的分页在这里我用了第一个方法在一个存储过程里面返回了两个结果集数据记录总数和要求的结果集
返回的记录总数取决于要执行查询例如一个where条件可以限制返回的结果集的大小因为在分页界面中必须要根据数据集记录的大小来计算总的页数所以必须要返回结果集的记录数例如如果一共有条记录如果用where条件就可以过滤成只返回条记录存储过程的分页逻辑应该知道返回那些需要显示的数据
三连接池
用TCP来连接你的应用程序与数据库是一件昂贵的事情(很费时的事情)微软的开发者可以通过用连接池来反复的使用数据库的连接比起每次请求都用TCP来连一次数据库连接池只有在不存在有效的连接时才新建一个TCP连接当关闭一个连接的时候它会被放到池中它仍然会保持与数据库的连接这样就可以减少与数据库的TCP连接次数
当然你要注意那些忘记关的连接你应在每次用完连接后马上关闭它我要强调的是无论什么人说net framework中的GC(垃圾收集器)总会在你用完连接对象后调用连接对象的Close或者Dispose方法显式的关闭你的连接不要期望CLR会在你想象的时间内关掉连接虽然CLR最终都要销毁对象和关闭边接但是我们并不能确定它到底会在什么时候做这些事情
要用连接池优化有两条规则第一打开连接处理数据然后关闭连接如果你必须在每次请求中多次打开或关闭连接这好过一直打开一个边接然后把它传到各个方法中第二用相同的连接字符串(或者用相同的用户标识当你用集成认证的时候)如果你没有用相同的连接字符串如你用基于登录用户的连接字符串这将不能利用连接池的优化功能如果你用的是集成的论证因为用户很多所以你也不能充分利用连接池的优化功能NET CLR提供了一个数据性能计数器它在我们需要跟蹤程序性能特性的时候非常有用当然也包括连接池的跟蹤了
无论你的应用程序什么时候要连在另一台机子的资源如数据库你都应该重点优化你连资源所花的时间接收和发送数据的时间以及往返回之间的次数优化你的应用程序中的每一个处理点(process hop)它是提高你的应用的性能的出发点
应用程序层包含与数据层连接传送数据到相应的类的实例以及业务处理的逻辑例如在Community Server中要组装一个Forums或者Threads集合然后应用业务逻辑如授权更重要的这里要完成缓存逻辑
[] [] []