使用多结果集读取数据减少服务器往返,提高性能

先来谈一下什么是多结果集?以及为什么需要它?

假设我们的一个窗体上有多个控件,需要绑定多个数据源。那么传统情况下,我们可以用不同的命令去读取不同的数据,然后分别绑定。这样做本来无可厚非,但如果从性能上考虑的话,就有改进的必要了。

因为每个单独的命令执行都是需要发生一次服务器的往返的,所以如果能够把数据一次性读取到,统一发给用户程序,再在客户端做单独的绑定,这样的设计可以减少服务器往返次数,提高性能。

以下是一些代码和比较

使用DataReader执行单结果集查询:每次返回一个结果集。(这是传统的方式)

using (SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString))
{
    SqlCommand cmd = conn.CreateCommand();
    cmd.CommandText = "SELECT CustomerID FROM Customers";
    conn.Open();
    SqlDataReader reader1 = cmd.ExecuteReader();
    DataTable tb1 = new DataTable();
    tb1.Load(reader1);

listBox1.DataSource = tb1;
    listBox1.DisplayMember = "CustomerID";
    reader1.Close();

SqlCommand cmd2 = conn.CreateCommand();
    cmd2.CommandText = "SELECT OrderID,OrderDate FROM Orders";
    SqlDataReader reader2 = cmd2.ExecuteReader();
    DataTable tb2 = new DataTable();
    tb2.Load(reader2);
    dataGridView2.DataSource = tb2;
    reader2.Close();
    conn.Close();
}

很显然,这样的话,就会发生两次的服务器往返。(两次批处理的过程)

使用DataReader做多结果集查询:一次性读取两个表格的数据

using (SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString + ";MultipleActiveResultSets=true"))
{
    SqlCommand cmd = conn.CreateCommand();
    cmd.CommandText = "SELECT CustomerID FROM Customers;SELECT OrderID FROM Orders";
    conn.Open();
    SqlDataReader reader = cmd.ExecuteReader();
    while (reader.Read())
    {
        listBox1.Items.Add(reader[0].ToString());
    }

while (reader.NextResult())
    {
        while (reader.Read())
        {
            listBox2.Items.Add(reader[0].ToString());
        }
    }

reader.Close();
    conn.Close();
}

需要特别注意的是,因为DataReader是一个只向前,只读的游标集。所以如果它的结果集有超过一个,需要通过NextResult方法进行移动。同时,还需要启用MARS:多活动结果集 的支持。

如果换成是DataSet的方式,就无需这么麻烦,因为DataSet天生就是支持多个表格,在用DataAdatper的Fill方法填充数据的时候,它会自动地建立多个表格在DataSet里面。

using (SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString))
{
    SqlCommand cmd = conn.CreateCommand();
    cmd.CommandText = "SELECT CustomerID FROM Customers;SELECT OrderID FROM Orders";
    conn.Open();

SqlDataAdapter adapter = new SqlDataAdapter(cmd);
    DataSet ds = new DataSet();
    adapter.Fill(ds);

this.listBox1.DataSource = ds.Tables[0];
    listBox1.DisplayMember = "CustomerID";
    this.dataGridView2.DataSource = ds.Tables[1];
    conn.Close();
}

时间: 2024-10-11 11:33:44

使用多结果集读取数据减少服务器往返,提高性能的相关文章

使用jprofile研究线程分配和同步以发现死锁和数据竞争问题,提高性能

死锁示例程序:ThreadTest,这是经典的同步嵌套发生死锁的示例: public class ThreadTest { public static Object lock1 = new Object(); public static Object lock2 = new Object(); public static void method1() { trace("Inside method1"); synchronized (lock1) { trace("Method

一段mongodb服务器读取数据超时的故事

北京时间 2016年9月25日  22:58:30 PM 近期线上生产环境mongodb的总是发现读取数据超时的问题,今天下午坐下来细细的研究了一番,大致过程如下: 业务背景 线上有一对mongodb主从的服务器,只是简单做了mongodb的主从,master - slave. 开始以为做了主从就能确保数据不丢的问题了,确实,数据没有发生丢失的问题,但是近期发现好多用户在点击某些操作要读取mongo里面的数据内容的时候,要等待很长的时间,这样的等待是叫人无法忍受的. 最开始的时候,以为做了主从,

echarts通过ajax向服务器发送post请求,servlet从数据库读取数据并返回前端

1.echarts的官网上的demo,都是直接写死的随机数据,没有和数据库的交互,所以就自己写了一下,ok,我们开始一步一步走一遍整个流程吧. 就以官网最简单的那个小demo来做修改吧.官网上的小demo的效果图如下:(很熟悉,有没有) 2.按照echarts的使用方法新建一个echarts.html文件.为ECharts准备一个具备大小(宽高)的Dom(讲的有点细,熟悉的朋友直接跳过) <!DOCTYPE html> <head> <meta charset="u

实时数据分布式服务器的策略

对于多并发实时数据的服务器,需要考虑的一些策略,使负载能在不同的服务器进程中异步处理,含有当机恢复服务器进程数据,动态维护服务器进程,提高数据读写的速度. 其中的一些策略如下: 1.p2p :服务器网关中转客户端地址数据消息到另一客户端,客户端之间通信大文件. 2.多网关. (1)用户网关 支持网关连接的负载均衡,通过网关的分配服务器分配用户连接到的网关.网关支持多端登陆,则每个端登陆不同的用户网关. (2)分布式子系统网关 每个分布式子系统含自己的网关.用户进入子系统时会重新登陆子系统的网关(

Redis异构集群数据在线迁移工具Redis-Migrate-Tool【转】

摘要:Redis-Migrate-Tool(后面都简称RMT),是唯品会开源的redis数据迁移工具,主要用于异构redis集群间的数据在线迁移,即数据迁移过程中源集群仍可以正常接受业务读写请求,无业务中断服务时间.这篇blog主要内容包括工具特性简介.使用方法以及注意的要点.关于实现的原理,可以自行阅读源码理解或者联系我们交流. 目前该项目已经开源在GitHub上(https://github.com/vipshop/redis-migrate-tool 链接入口可点击原文阅读). 一.RMT

用python从符合一定格式的txt文档中逐行读取数据并按一定规则写入excel(openpyxl支持Excel 2007 .xlsx格式)

前几天接到一个任务,从gerrit上通过ssh命令获取一些commit相关的数据到文本文档中,随后将这些数据存入Excel中.数据格式如下图所示 观察上图可知,存在文本文档中的数据符合一定的格式,通过python读取.正则表达式处理并写入Excel文档将大大减少人工处理的工作量. 1. 从gerrit获取原始信息,存入文本文档: $ssh –p 29418 <your-account>@192.168.1.16 gerrit query status:merged since:<date

Android 采用post方式提交数据到服务器

接着上篇<Android 采用get方式提交数据到服务器>,本文来实现采用post方式提交数据到服务器 首先对比一下get方式和post方式: 修改布局: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="m

关于MATLAB中xlswrite函数写数据出现服务器异常情况的解决办法

在网上找了半天解决办法,也没有找到,在此共享我自己的一个问题,不具有普遍性,仅作参考! 问题描述:MATLAB调用xlsread函数出现问题,第一次运行的时候,出现服务器异常,再次运行能够正常读取数据: 在调用xlswrite函数时,一直出现服务器异常状况,不能将数据写入excel表格中. 问题关键:不是MATLAB的原因,问题出在excel软件上! 问题解决:xlswrite函数在调用时会占用excel的com端口,所以要保证在调用时这个端口是开放的,也就是没有被其他程序占用.打开excel(

MongoDB复制集及数据分片详解

前言 MongoDB是一个由C++语言编写的基于分布式文件存储的数据库,是当前NoSQL数据库中比较热门的一种,旨在为Web应用提供可扩展的高性能数据存储解决方案.本文介绍MongoDB复制集及数据分片. MongoDB 简介 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的.支持的数据结构非常松散,因此可以存储比较复杂的数据类型.最大的特点是其支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询