ADO.NET连接池

开发人员都知道,我们在每次用程序操作数据库的时候,至少要经过三步
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. 最好不要在上一个连接没有关闭的情况下又用同一个连接字符串连接数据库并打开连接,因为这样事后会在连接池创建多个对象。
Delphi TThread中文注释2009-10-22 16:58TThread是一个抽象类,可以创建几个独立的线程。 类关系 TObject 在一个多线程的应用程序中创建一个TThread的后子类代表一个线程。每一新子类的TThread对象的实例是一个新的线程。从TThread派生的多线程实例可以构成Delphi的多线程应用程序。    当一个应用程序运行时,应用程序就被载入内存准备执行。此时,它成为包含一个或多个线程的进程,每个线程含有数据、代码和系统资源。线程执行应用程序的部分内容,并由系统分配CPU时间。同一进程的所有线程共享同一地址空间,可以访问进程的全局变量。线程通过以下工作改善应用的性能:管理多通信设备的输入。    区分任务的优先级。优先级高的处理紧急的任务。优先级低的处理其他任务。    以下是使用线程的一些建议:    同时跟踪太多的线程消耗CPU时间。对单处理器系统,一个进程最多有16个线程。    当多个线程更新相同的资源时,应使线程同步以避免冲突。    大多数访问VCL对象和更新窗体的方法必须从主VCL线程内部调用。    以下为创建和使用一个新线程的过程:    (1)单击File|New|Thread菜单项,创建一个包含对象的新单元,该对象源于TThread类。    (2)定义新线程对象和Create方法。    (3)通过插入线程执行时需要的代码定义线程对象和Execute方法。    (4)将使用VCL组件的任何调用传递给Synchronize方法,以避免多线程冲突。
评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aiming66

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值