晚上闲来无事,突然想测试一下Ado.Net连接池带来的连接速度提升,写了以下代码:
using System;
using System.Configuration;
using System.Data.SqlClient;
using System.Diagnostics;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string _connString = ConfigurationManager.ConnectionStrings["ConnStr"].ToString();
SqlConnection conn = new SqlConnection(_connString);
Stopwatch sw = new Stopwatch();
sw.Start();
conn.Open();
sw.Stop();
Console.WriteLine("1连接所用时间:{0}" , sw.ElapsedTicks.ToString());
conn.Close();//关闭连接
sw.Reset();
sw.Start();
conn.Open();//现在是直接从连接池中分配的连接,所以速度要快很多
sw.Stop();
Console.WriteLine("2连接所用时间:{0}", sw.ElapsedTicks.ToString());
conn.Dispose();//释放连接
conn.ConnectionString = _connString;
sw.Reset();
sw.Start();
conn.Open();//Dispose()后,仍然可以连接!(前提是必须重设连接字符串)
sw.Stop();
Console.WriteLine("3连接所用时间:{0}", sw.ElapsedTicks.ToString());//从输出结果上看,这一次仍然要比首次连接快很多,貌似也是从连接池中取的
conn.Close();
using (SqlConnection conn2 = new SqlConnection(_connString))
{
try
{
sw.Reset();
sw.Start();
conn2.Open();//即使创建一个完全不同的新Connection对象,只要连接字符串相同,仍然会从连接池内中分配已有连接,所以速度仍然很快
sw.Stop();
Console.WriteLine("4连接所用时间:{0}", sw.ElapsedTicks.ToString());
}
catch (Exception)
{
throw;
}
finally {
conn2.Close();
}
}
//连续多次调用Close()或Dispose()不会抛出异常,但连续多次调用Open()会抛出异常
//conn.Close();
//conn.Close();
//conn.Dispose();
//conn.Dispose();
Console.Read();
//即使不关闭连接,程序退出时,连接也被会自动销毁
}
}
}
本机执行结果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()后,再次连接的速度,有时快,有时慢(但总体比首次连接要快),不知道是不是我机器的问题.