数据库连接池的作用

一、问题引入
首先看段代码:

            string connStr = "Data Source = DESKTOP-8SI7GC4;Initial Catalog = MySchool;Integrated Security = true;"
            SqlConnection conn = new SqlConnection(connStr);
            conn.Open();
 
            //并没有释放这个对象,只是将连接状态关闭,同时清空连接字符串。
            //重新设置conn的ConnectionString,即可重新连接证实了这点。
            conn.Dispose();
            conn.ConnectionString = connStr;
 
            conn.Open();

一般来说,对象调用Dispose()方法之后立即被销毁,在内存中不复存在。但conn连接对象比较特别。conn调用Dispose()方法之后,系统并没有释放这个对象,只是将其连接状态关闭,同时清空连接字符串。重新设置conn的ConnectionString,即可重新连接证实了这点。类似字符串。字符串存储在内存中的常量区。当我们创建一个字符串时,系统会先查明该字符串是否存在常量区。如果存在,直接返回这个字符串的地址。否则就新建一个字符串。

那为什么conn调用Dispose()方法之后没有被销毁呢?很好理解,为了节省内存和时间啊。只是,这涉及到了连接池。

二、示例
看下在有无连接池的两种情况下,创建1000个连接对象所耗费的时间。

有连接池:

            Stopwatch sw = new Stopwatch();
            sw.Start();
            for (int i = 0; i < 1000; i++)
            {
                string connStr = "Data Source = DESKTOP-8SI7GC4;Initial Catalog = MySchool;Integrated Security = true";
                SqlConnection conn = new SqlConnection(connStr);
                conn.Open();
                conn.Close();
            }
            sw.Stop();
            MessageBox.Show(sw.Elapsed.ToString());
结果:0.1438238s

无连接池:在连接字符串后添加了 +“pooling = false” ,默认为true。
            Stopwatch sw = new Stopwatch();
            sw.Start();
            for (int i = 0; i < 1000; i++)
            {
                string connStr = "Data Source = DESKTOP-8SI7GC4;Initial Catalog = MySchool;Integrated Security = true;pooling = false";
                SqlConnection conn = new SqlConnection(connStr);
                conn.Open();
                conn.Close();
            }
            sw.Stop();
            MessageBox.Show(sw.Elapsed.ToString());

结果:4.1383434s

三、连接池的作用

简单说,存储连接通道对象。但它是如何达到节省时间和空间的目的呢?

当一个连接通道使用完后,系统并不会将其释放,而是将它存储在连接池里。下次需要使用连接通道的时候,系统会判断连接池里是否有空闲的连接通道对象。如果有,设置其连接字符串,修改其连接状态,重新使用。

这样能在很大程度上减少实例化的次数,节省了内存和时间,提升了效率。 要知道,创建一个对象需要做3件事:开辟堆空间,调用构造函数,返回地址。而这些行为是很消耗性能的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值