//启用连接池 string constr = "Data Sourse=zxtiger; Initial Catalog=itcastcn;Integrated Security=True"; Stopwatch watch = new Stopwatch(); watch.Start(); for (int i = 0; i < 2000; i++) { using (SqlConnection con = new SqlConnection(constr)) { con.Open(); con.Close(); } } watch.Stop(); Console.WriteLine(watch.Elapsed); Console.ReadKey();
//启用连接池后,只执行一次连接操作
//禁用连接池 string constr = "Data Sourse=zxtiger; Initial Catalog=itcastcn;Integrated Security=True;Pooling=false"; Stopwatch watch = new Stopwatch(); watch.Start(); for (int i = 0; i < 2000; i++) { using (SqlConnection con = new SqlConnection(constr)) { con.Open(); con.Close(); } } watch.Stop(); Console.WriteLine(watch.Elapsed); Console.ReadKey();
连接池默认是打开的,当连接池被禁用后
//00:00:00.1383385
//00:00:03.9974913
前后相差29被
所谓的连接池,就是一个与连接对象Connection相关的集合,这不只是简单的集合,而是有一定的机制在内部。我们做开发时,可能建立Connection连接对象,关闭连接对象,有时候还调用Dispose来释放连接。下次再用时,便重新实例化一个连接。但在池中的连接不随连接对象的Close或Dispose而释放。如果下次重新建立连接,连接字符串与前一次完全一模一样,则连接池就会把上次可用的连接对象赋给连接去用。如果两个连接字符串有一点不一样,即使在某一个地方多一个空格,连接池也不会以为是相同的连接,这点微软可能在内部只直接去比较两个字符串了,而不是比较连接数据库字符串的键值互相匹配。
连接池的好处就是保留连接对象,防止下次重头再来实例化一个连接对象。
由于每次正常连接数据库至少执行3个操作(1.登陆数据库服务器2.执行操作3.注销用户),所以每次通过Connection向数据库服务器申请一个连接都比较耗时【ado.net默认启用了连接池】