Ado.Net连接池的速度测试

晚上闲来无事,突然想测试一下Ado.Net连接池带来的连接速度提升,写了以下代码:

 

 1using System;
 2using System.Configuration;
 3using System.Data.SqlClient;
 4using System.Diagnostics;
 5
 6namespace ConsoleApplication1
 7{
 8    class Program
 9    {
10        static void Main(string[] args)
11        {
12            string _connString = ConfigurationManager.ConnectionStrings["ConnStr"].ToString();
13
14            SqlConnection conn = new SqlConnection(_connString);
15
16            Stopwatch sw = new Stopwatch();
17
18            sw.Start();
19            conn.Open();
20            sw.Stop();
21            Console.WriteLine("1连接所用时间:{0}" , sw.ElapsedTicks.ToString());
22
23            conn.Close();//关闭连接
24
25            sw.Reset();
26            sw.Start();
27            conn.Open();//现在是直接从连接池中分配的连接,所以速度要快很多
28            sw.Stop();
29
30            Console.WriteLine("2连接所用时间:{0}", sw.ElapsedTicks.ToString());
31
32            conn.Dispose();//释放连接
33
34            conn.ConnectionString = _connString;
35
36            sw.Reset();
37            sw.Start();
38            conn.Open();//Dispose()后,仍然可以连接!(前提是必须重设连接字符串)
39            sw.Stop();
40            Console.WriteLine("3连接所用时间:{0}", sw.ElapsedTicks.ToString());//从输出结果上看,这一次仍然要比首次连接快很多,貌似也是从连接池中取的
41
42            conn.Close();
43
44
45            using (SqlConnection conn2 = new SqlConnection(_connString))
46            {
47                try
48                {
49                    sw.Reset();
50                    sw.Start();
51                    conn2.Open();//即使创建一个完全不同的新Connection对象,只要连接字符串相同,仍然会从连接池内中分配已有连接,所以速度仍然很快
52                    sw.Stop();
53                    Console.WriteLine("4连接所用时间:{0}", sw.ElapsedTicks.ToString());
54                }
55                catch (Exception)
56                {
57
58                    throw;
59                }
60                finally {
61                    conn2.Close();
62                }
63            }
64           
65
66           
67            //连续多次调用Close()或Dispose()不会抛出异常,但连续多次调用Open()会抛出异常
68            //conn.Close();
69            //conn.Close();
70
71            //conn.Dispose();
72            //conn.Dispose();
73            Console.Read();
74
75            //即使不关闭连接,程序退出时,连接也被会自动销毁
76        }
77    }
78}

 

本机执行结果1:
--------------------------------
1连接所用时间:480219
2连接所用时间:130
3连接所用时间:60
4连接所用时间:47
--------------------------------

本机执行结果2:
--------------------------------
1连接所用时间:476064
2连接所用时间:137
3连接所用时间:1411
4连接所用时间:49
--------------------------------

本机执行结果3:
--------------------------------
1连接所用时间:691719
2连接所用时间:132
3连接所用时间:69
4连接所用时间:53
--------------------------------

可以明显看出,连接池技术确实让后来的Connection对象Open时速度提升不少,不过有点出乎意料的是"4连接"始终要比"2连接"快不少?既然都是从连接池内中分配的,应该速度差不多才是!另外Dispose()后,再次连接的速度,有时快,有时慢(但总体比首次连接要快),不知道是不是我机器的问题.

 

时间: 2024-07-29 22:55:42

Ado.Net连接池的速度测试的相关文章

ADO.NET连接池FAQ

ado 摘要 连接池允许应用程序从连接池中获得一个连接并使用这个连接,而不需要为每一个连接请求重新建立一个连接.一旦一个新的连接被创建并且放置在连接池中,应用程序就可以重复使用这个连接而不必实施整个数据库连接创建过程. 当应用程序请求一个连接时,连接池为该应用程序分配一个连接而不是重新建立一个连接:当应用程序使用完连接后,该连接被归还给连接池而不是直接释放. 如何实现连接池 确保你每一次的连接使用相同的连接字符串(和连接池相同):只有连接字符串相同时连接池才会工作.如果连接字符串不相同,应用程序

关于ADO.NET连接池

前几天同事问我一个问题,一种CS架构的程序,直接把SQL Server作为服务端,每个客户端直接连接数据库操作,如果客户端打开的数量过多时SQL Server的连接数将会特别高,数据库端形成性能瓶颈,这种情况下怎么办?想了想,造成这种情况的原因是ADO.NET的内部机制造成的.ADO.NET中为了提高性能,所以使用了连接池,这样每个请求就不必都创建一个连接,然后认证,然后执行SQL,而是从连接池中直接取出连接执行SQL,执行完成后也并不是真正关闭连接,而是将该连接重新放回连接池中.如果有100个

详解ADO.NET连接池

ADO.NET中提供了连接池的功能,多数开发人员很少设置它,因为它是默认的. 界面设置如下图: 关闭连接池也很简单,在连接字符串如下: Data Source=(local);Initial Catalog=AdventureWorks;Integrated Security=SSPI;Pooling=False; 但连接池的本质是什么样的呢? 用Reflector,打开System.Data.SqlClient.SqlConnection的ConnectionString属性的设置值的方法,如

一起谈.NET技术,详解ADO.NET连接池

ADO.NET中提供了连接池的功能,多数开发人员很少设置它,因为它是默认的. 界面设置如下图:   关闭连接池也很简单,在连接字符串如下: Data Source=(local);Initial Catalog=AdventureWorks;Integrated Security=SSPI;Pooling=False; 但连接池的本质是什么样的呢?   用Reflector,打开System.Data.SqlClient.SqlConnection的ConnectionString属性的设置值的

SQL Server的Execute As与连接池结合使用的测试

原文:SQL Server的Execute As与连接池结合使用的测试 简介     在SQL Server中,Execute As关键字允许当前账户在特定上下文中以另一个用户或登录名的身份执行SQL语句,比如用户张三有权限访问订单表,用户李四并没有权限访问订单表,那么给予用户李四访问订单的表的权限就有些过头了,因为李四可能只有在很特定的上下文环境中才需要访问订单表,因此可以在特定上下文中使用Execute As Login 张三,暂时以张三的身份访问订单表,从而保证更安全的权限控制.    

ADO.NET之连接池技术的使用详解_实用技巧

连接到数据库服务器通常需要一定的时间,且服务器也需要一定的资源来处理连接.Web应用程序有时处理成千上万的连接,需要相当多的资源来处理连接.ADO.NET具有连接池的特性,连接池的功能是保留一定数量的连接,当用户使用相同的连接字符串再次连接服务器时,ASO.NET将使用连接池中的连接而不用重新发起一次连接过程.当调用Close方法关闭连接时,ADO.NET将使用连接池中的连接而不用重新发起一次连接过程.当调用Close方法关闭连接时,连接将会返回到连接池中,下次再次调用Open方法时,将从连接池

.net 中的SqlConnection连接池机制详解_实用技巧

正确的理解这个连接池机制,有助于我们编写高效的数据库应用程序. 很多人认为 SqlConnection 的连接是不耗时的,理由是循环执行 SqlConnection.Open 得到的平均时间几乎为0,但每次首次open 时,耗时又往往达到几个毫秒到几秒不等,这又是为什么呢? 首先我们看一下 MSDN 上的权威文档上是怎么说的 Connecting to a database server typically consists of several time-consuming steps. A

DBCP、C3P0、Proxool 、 BoneCP开源连接池的比较(完全转载)

本文章完全为转载内容. 转载地址:http://blog.csdn.net/july_2/article/details/18843419 转载的原因是,好好的一篇文章,他 给复制了N编.    简介   使用评价  项目主页  DBCP DBCP是一个依赖Jakarta commons-pool对象池机制的数据库连接池.DBCP可以直接的在应用程序用使用 可以设置最大和最小连接,连接等待时间等,基本功能都有,此连接池的持续运行的稳定性还是可以,不过速度稍慢,在大并发量的压力下稳定性有所下降,此

SqlConnection 的连接池机制解析

物理连接建立时,需要做和服务器握手,解析连接字符串,授权,约束的检查等等操作,而物理连接建立后,这些操作就不会去做了.这些操作是需要一定的时间的.所以很多人喜欢用一个静态对象存储 SqlConnection 来始终保持物理连接,但采用静态对象时,多线程访问会带来一些问题,实际上,我们完全不需要这么做,因为 SqlConnection 默认打开了连接池功能,当程序 执行  SqlConnection.Close 后,物理连接并不会被立即释放,所以这才出现当循环执行 Open操作时,执行时间几乎为0