文章目录
开发人员都知道,我们在每次用程序操作数据库的时候,至少要经过三步
1、连接数据库:登录数据库服务器。
2、执行操作:执行sql语句或者存储过程等。
3、关闭连接:注销用户。
所以,每次在通过connection 向数据库服务器申请连接的时候非常的费时和消耗资源。
演示:
首先我们通过一个实例来演示一下开启连接池和关闭连接池的效果:
1)开启连接池的情况下:
我要测试1000次打开关闭数据库所用的时间。
代码
using System;
using System.Data.SqlClient;
using System.Diagnostics;
namespace 开启ADO.NET资源池
{
class Program
{
static void Main(string[] args)
{
string constr = "Data Source=.;Initial Catalog=crb_tpm;uid=sa;pwd=123456";
Stopwatch watch = new Stopwatch();//用户测量运行时间
watch.Start();
for (int i = 0; i < 1000i++)
{
using (SqlConnection con = new SqlConnection(constr))
{
con.Open();
con.Close();
}
}
watch.Stop();
Console.WriteLine(watch.Elapsed);//打印总运行时间
Console.ReadKey();
}
}
}
运行结果:00:00:00.2632044秒
2)关闭连接池的情况下:
我要测试1000次打开关闭数据库所用的时间。
代码
using System;
using System.Data.SqlClient;
using System.Diagnostics;
namespace 开启ADO.NET资源池
{
class Program
{
static void Main(string[] args)
{
// string constr = "Data Source=.;Initial Catalog=crb_tpm;uid=sa;pwd=123456";
string constr = "Data Source=.;Initial Catalog=crb_tpm;uid=sa;pwd=123456;pooling=false";//pooling=false表示关闭连接池
Stopwatch watch = new Stopwatch();//用户测量运行时间
watch.Start();
for (int i = 0; i < 1000; i++)
{
using (SqlConnection con = new SqlConnection(constr))
{
con.Open();
con.Close();
}
}
watch.Stop();
Console.WriteLine(watch.Elapsed);//打印总运行时间
Console.ReadKey();
}
}
}
运行结果:00:01:11.0209661秒
结果显而易见,在关闭连接池的情况下,仅仅1000次的链接数据库,花费的时间是开启连接池情况的300多倍。(这个时间可能跟我的pc执行效率有关。)
分析
我们在通过下面的两个图看一下原因:
a/开启连接池的情况下我们用sql server profileer分析一下:
补充:logout是在关闭程序后执行的,也就是说,只要我的程序跑着,那么就不会关闭连接,会保留一段时间。
b/关闭连接池的情况下我们用sql server profileer分析一下:
分析结果:
- 当开启ADO.NET连接池后,真实只会创建一个连接对象,并且该连接对象默认并不会立刻关闭,后面的所有其他连接对象都是使的这个连接对象。
- 禁用连接池后,每次创建一个连接对象,然后关闭连接。此时会真正的创建多个连接对象并且都是每次登录、退出。
分析原因:
其实大家可以知道,每次连接数据库的时候,进行的步骤很多 :
- 首先创建一个对象
- 连接的时候,数据库用的是ip/tcp协议,要经过三次握手操作,从而确保两个计算机之间可以正常通信。
- 而当启用ADO.NET连接池的时候,当调用con.close()方法的时候,并不会关闭连接,而是将当前的链接对象放入到连接池中。
使用ADO.NET连接池注意事项:
- 当对象创建费时,使用频繁的时候要使用连接池。
- 当第一次连接数据库的时候,因为连接池中没有任何现成的可用连接对象,所以第一次要创一个连接对象。
- 当调用con.close()方法的时候,并不会关闭连接,而是将当前的链接对象放入到连接池中。
- 当下次再需要连数据库的时候。首先会检查本次连所使的连接字符串是否与连接池中现有的连接对象所使用的连接字符串一样,如果一样。则可以直从连接池中取出该连对象,直接使用。如果连接池中没有现成的连接对象,或名池中的连接对象所使用的连接字符串与本次要使用的连接字符串不一致,那么此时都会再创一个新的连接对象。
- 当第二次连接的时候,使用的是连接池的链接对象。在此同时又来了一个程序用同样的连接字符串调用数据库,那么会创建一个新的连接对象,当这两个程序用完后,并都调用close方法后,此时 连接池中会有两个连接对象。
- 我们可以设置同一个连接字符串的连接对象在池中的最大个数以及整个池中不同字符串连接对象的最大个数。当超过这个最大值,会被释放。
- 默认情况下.NET的链接池是启用的。
- 连接池的对象,如果长时间不适用会被自动释放。
- 经过第2、3、4 、5点的介绍,所以我们最好在连接数据库取出结果后立刻调用close方法关闭连接,这样连接池的同一个对象才会被其他的程序重复利用。
- 最好不要在上一个连接没有关闭的情况下又用同一个连接字符串连接数据库并打开连接,因为这样事后会在连接池创建多个对象。