博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ADO.NET连接池
阅读量:2240 次
发布时间:2019-05-09

本文共 2993 字,大约阅读时间需要 9 分钟。

文章目录

开发人员都知道,我们在每次用程序操作数据库的时候,至少要经过三步

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连接池后,真实只会创建一个连接对象,并且该连接对象默认并不会立刻关闭,后面的所有其他连接对象都是使的这个连接对象。
  • 禁用连接池后,每次创建一个连接对象,然后关闭连接。此时会真正的创建多个连接对象并且都是每次登录、退出。

分析原因:

其实大家可以知道,每次连接数据库的时候,进行的步骤很多 :

  1. 首先创建一个对象
  2. 连接的时候,数据库用的是ip/tcp协议,要经过三次握手操作,从而确保两个计算机之间可以正常通信。
  3. 而当启用ADO.NET连接池的时候,当调用con.close()方法的时候,并不会关闭连接,而是将当前的链接对象放入到连接池中。

使用ADO.NET连接池注意事项:

  1. 当对象创建费时,使用频繁的时候要使用连接池。
  2. 当第一次连接数据库的时候,因为连接池中没有任何现成的可用连接对象,所以第一次要创一个连接对象。
  3. 当调用con.close()方法的时候,并不会关闭连接,而是将当前的链接对象放入到连接池中。
  4. 当下次再需要连数据库的时候。首先会检查本次连所使的连接字符串是否与连接池中现有的连接对象所使用的连接字符串一样,如果一样。则可以直从连接池中取出该连对象,直接使用。如果连接池中没有现成的连接对象,或名池中的连接对象所使用的连接字符串与本次要使用的连接字符串不一致,那么此时都会再创一个新的连接对象。
  5. 当第二次连接的时候,使用的是连接池的链接对象。在此同时又来了一个程序用同样的连接字符串调用数据库,那么会创建一个新的连接对象,当这两个程序用完后,并都调用close方法后,此时 连接池中会有两个连接对象。
  6. 我们可以设置同一个连接字符串的连接对象在池中的最大个数以及整个池中不同字符串连接对象的最大个数。当超过这个最大值,会被释放。
  7. 默认情况下.NET的链接池是启用的。
  8. 连接池的对象,如果长时间不适用会被自动释放。
  9. 经过第2、3、4 、5点的介绍,所以我们最好在连接数据库取出结果后立刻调用close方法关闭连接,这样连接池的同一个对象才会被其他的程序重复利用。
  10. 最好不要在上一个连接没有关闭的情况下又用同一个连接字符串连接数据库并打开连接,因为这样事后会在连接池创建多个对象。
你可能感兴趣的文章
检测iOS的网络可用性并打开网络设置
查看>>
简单封装FMDB操作sqlite的模板
查看>>
iOS开发中Instruments的用法
查看>>
强引用 软引用 弱引用 虚引用
查看>>
数据类型 java转换
查看>>
"NetworkError: 400 Bad Request - http://172.16.47.117:8088/rhip/**/####t/approval?date=976
查看>>
mybatis 根据 数据库表 自动生成 实体
查看>>
C结构体、C++结构体、C++类的区别
查看>>
进程和线程的概念、区别和联系
查看>>
CMake 入门实战
查看>>
绑定CPU逻辑核心的利器——taskset
查看>>
Linux下perf性能测试火焰图只显示函数地址不显示函数名的问题
查看>>
c结构体、c++结构体和c++类的区别以及错误纠正
查看>>
Linux下查看根目录各文件内存占用情况
查看>>
A星算法详解(个人认为最详细,最通俗易懂的一个版本)
查看>>
利用栈实现DFS
查看>>
(PAT 1019) General Palindromic Number (进制转换)
查看>>
(PAT 1073) Scientific Notation (字符串模拟题)
查看>>
(PAT 1080) Graduate Admission (排序)
查看>>
Play on Words UVA - 10129 (欧拉路径)
查看>>