ab.exe介绍

ab.exe是apache server的一个组件,用于监测并发请求,并显示监测数据

具体使用及下载地址请参考:http://www.cnblogs.com/gossip/p/4398784.html
 
本文的目的
   通过webapi接口模拟100个并发请求下,同步和异步访问数据库的性能差异
 
 
创建数据库及数据
--创建表结构
CREATE TABLE dbo.[Cars] (
Id INT IDENTITY(1000,1) NOT NULL,
Model NVARCHAR(50) NULL,
Make NVARCHAR(50) NULL,
[Year] INT NOT NULL,
Price REAL NOT NULL,
CONSTRAINT [PK_Cars] PRIMARY KEY CLUSTERED (Id) ON [PRIMARY]
) ON [PRIMARY];
GO
 
--创建存储过程
CREATE PROCEDURE [dbo].[sp$GetCars]
AS
-- 存储过程执行过程中等待一秒
WAITFOR DELAY '00:00:01';
SELECT * FROM Cars;
GO
 
--初始化数据 
INSERT INTO dbo.Cars VALUES('Car1', 'Model1', 2006, 24950);
INSERT INTO dbo.Cars VALUES('Car2', 'Model1', 2003, 56829);
INSERT INTO dbo.Cars VALUES('Car3', 'Model2', 2006, 17382);
INSERT INTO dbo.Cars VALUES('Car4', 'Model3', 2002, 72733);
 
 
编写webapi程序
1、数据访问类(包含同步/异步访问数据库的方法)
 public class GalleryContext
    {
        readonly string _spName = "sp$GetCars";
        readonly string _connectionString =
        ConfigurationManager.ConnectionStrings["TestDBConnStr"].ConnectionString;
 
        /// <summary>
        /// 同步获取数据
        /// </summary>
        /// <returns></returns>
        public IEnumerable<Car> GetCarsViaSP()
        {
            using (var conn = new SqlConnection(_connectionString))
            {
                using (var cmd = new SqlCommand())
                {
                    cmd.Connection = conn;
                    cmd.CommandText = _spName;
                    cmd.CommandType = CommandType.StoredProcedure;
 
                    conn.Open();
                    using (var reader = cmd.ExecuteReader())
                    {
                        return reader.Select(r => carBuilder(r)).ToList();
                    }
                }
            }
        }
 
        /// <summary>
        /// 异步获取数据 
        /// </summary>
        /// <returns></returns>
        public async Task<IEnumerable<Car>> GetCarsViaSPAsync()
        {
            using (var conn = new SqlConnection(_connectionString))
            {
                using (var cmd = new SqlCommand())
                {
                    cmd.Connection = conn;
                    cmd.CommandText = _spName;
                    cmd.CommandType = CommandType.StoredProcedure;
                    conn.Open();
                    using (var reader = await cmd.ExecuteReaderAsync())  //调用异步方法
                    {
                        return reader.Select(r => carBuilder(r)).ToList();
                    }
                }
            }
        }
 
        //private helpers
        private Car carBuilder(SqlDataReader reader)
        {
            return new Car
            {
                Id = int.Parse(reader["Id"].ToString()),
                Make = reader["Make"] is DBNull ? null : reader["Make"].ToString(),
                Model = reader["Model"] is DBNull ? null : reader["Model"].ToString(),
                Year = int.Parse(reader["Year"].ToString()),
                Price = float.Parse(reader["Price"].ToString()),
            };
        }

}

 
2、数据库对应实体类及辅助扩展方法
  public class Car
    {
        public int Id { get; set; }
        public string Make { get; set; }
        public string Model { get; set; }
        public int Year { get; set; }
        public float Price { get; set; }

}

 
 public static class Extensions
    {
        public static IEnumerable<T> Select<T>(
        this SqlDataReader reader, Func<SqlDataReader, T> projection)
        {
            while (reader.Read())
            {
                yield return projection(reader);
            }
        }
    } 
 
3、webapi Controller调用方法
  //同步调用接口
    public class SPCarsSyncController : ApiController
    {
        readonly GalleryContext galleryContext = new GalleryContext();
        public IEnumerable<Car> Get()
        {
            return galleryContext.GetCarsViaSP();
        }

}  

 
 //异步调用接口
    public class SPCarsAsyncController : ApiController
    {
        readonly GalleryContext galleryContext = new GalleryContext();
        public async Task<IEnumerable<Car>> Get()
        {
            return await galleryContext.GetCarsViaSPAsync();
        }

}

 
4、数据库连接配置文件
<connectionStrings>
    <add name="TestDBConnStr"
    connectionString="Server=你的数据库地址;Database=TestDB;User Id=sa;Password=123;Integrated Security=false;Max Pool Size=500;Asynchronous Processing=True;"
    providerName="System.Data.SqlClient" />

</connectionStrings>

 其中:
Max Pool Size:表示连接池的最大数量
Asynchronous Processing=True;表示数据库支持异步处理
Integrated Security=false;此处设为true或不设置会抛出异常
Login failed for user 'NT AUTHORITY\SYSTEM'
 
使用ab.exe模拟并发请求
模拟请求同步服务:
 
模拟请求异步服务:
 
结论:
    访问相同的数据表及数据,
    使用同步方式共用时20秒,平均每秒处理5个请求;
    使用异步方式共用时10秒,平均每秒处理10个请求;

使用ab.exe监测100个并发/100次请求情况下同步/异步访问数据库的性能差异的更多相关文章

  1. apache 自带的ab.exe 测试网站的并发量(网站压力测试)

    AB(ApacheBench) 是 Apache 自带的超文本传输协议 (HTTP) 性能测试工具. 其设计意图是描绘当前所安装的 Apache 的执行性能, 主要是显示 Apache 每秒可以处理多 ...

  2. java的高并发IO原理,阻塞BIO同步非阻塞NIO,异步非阻塞AIO

    原文地址: IO读写的基础原理 大家知道,用户程序进行IO的读写,依赖于底层的IO读写,基本上会用到底层的read&write两大系统调用.在不同的操作系统中,IO读写的系统调用的名称可能不完 ...

  3. 并发\并行,同步\异步,阻塞\非阻塞,IO多路复用解释

    并发.并行 并发:是指一个时间段内,有几个程序在同一个CPU上运行,但是任意时刻只有一个程序在CPU上运行.由于CPU的运行速度极快,可以在多个程序之间切换,这样造成一个假象就是多个程序同时在运行.并 ...

  4. PHP的压力测试工具ab.exe 和mpm介绍提高并发数

    该工具是apache自带的,可以用它来测试网站的并发量有多大和某个页面的访问时间. 基本用法: 1.  进入CMD,转到apache的bin目录下. 2.  执行命令ab.exe  -n 访问的问次数 ...

  5. 简单的并发测试工具 ab.exe ab.zip可下载 -摘自网络

    ab.exe是一个性能检测工具,是apache server中的一个小组件,使用简单,方便    下载地址:http://files.cnblogs.com/files/gossip/ab.zip   ...

  6. android Asynctask的优缺点?是否能同一时候并发100+asynctask呢?

    一  Asynctask的优缺点? AsyncTask,是android提供的轻量级的异步类,能够直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步运行的程度(能够通过接口实现UI ...

  7. 100万并发连接服务器笔记之Java Netty处理1M连接会怎么样

    前言 每一种该语言在某些极限情况下的表现一般都不太一样,那么我常用的Java语言,在达到100万个并发连接情况下,会怎么样呢,有些好奇,更有些期盼.这次使用经常使用的顺手的netty NIO框架(ne ...

  8. ab.exe使用

       ab.exe是一个性能检测工具,是apache server中的一个小组件,使用简单,方便    下载地址:http://files.cnblogs.com/files/gossip/ab.zi ...

  9. apache下ab.exe使用方法。。

    自己在cmd中写了半天的路径也没有写对..最后网上的一个哥们告诉我说没有共同语言了...毛线啊 差距确实很大!大能猫死panda早晚干掉你,叫你丫整天嘲讽我! 比如我的ab.exe在D盘的wamp文件 ...

随机推荐

  1. HDU5772 String problem

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission ...

  2. POJ 3617 Best Cow Line (模拟)

    题目链接 Description FJ is about to take his N (1 ≤ N ≤ 2,000) cows to the annual"Farmer of the Yea ...

  3. opencv_人脸检测、模型训练、人脸识别

    人脸检测.模型训练.人脸识别 2018-08-15 今天给大家带来一套人脸识别一个小案例,主要是帮助小伙伴们解决如何入门OpenCV人脸识别的问题,现在的AI行业比较火热,AI技术的使用比较广泛.就拿 ...

  4. 解决小米/红米手机无法进行jdwp调试的问题

    问题描述:在逆向一个app,研究环境是一台红米2,需要使用jdwp接口,也就是ddms下面这个界面: 但神奇的是,同一台主机上,模拟器的进程可以显示在ddms界面上,红米2确一个进程都没有显示出来.c ...

  5. 【MT8382/8121】使用绝对路径编译模块会导致recourse_overlay无法应用的问题

    之前为了方便mm模块编译,写了个脚本,实现了在任意模块其子目录下执行脚本即可编译的功能. 其实原理就是一层一层目录地往上寻找Android.mk文件,找到存放Android.mk目录后,就把该目录当作 ...

  6. linux 环境变量设置方法总结(PATH/LD_LIBRARY_PATH)

    linux 环境变量设置方法总结(PATH/LD_LIBRARY_PATH) http://blog.csdn.net/wangeen/article/details/8159500 设置 Linux ...

  7. 【 Linux】脚本导入格式

    在从windows文本(*.txt)格式导入到Linux中时,需要注意. 如果是直接将*.txt 导入到Linux系统,然后重命名使用会有问题,建议在linux系统中创建文件,然后直接复制内容到lin ...

  8. 堆外内存: Chronicle Map

    https://www.javacodegeeks.com/2015/04/chroniclemap-java-architecture-with-off-heap-memory.html Java堆 ...

  9. docker从零开始 存储(四)tmpfs挂载

    使用tmpfs挂载 volume和bind mounts允许您在主机和容器之间共享文件,以便即使在容器停止后也可以保留数据. 如果你在Linux上运行Docker,你有第三个选择:tmpfs moun ...

  10. Android sdk manager更新 下载API源码

    方法一:在C:\Windows\System32\drivers\etc路径下的hosts文件中加入如下代码即可更新 203.208.46.146 www.google.com74.125.113.1 ...