[转载].net下数据库连接池

之前写过一篇博客数据库连接池分析 分析了,通过代码来分析数据库连接池的作用。

这里要搞清楚一个概念,数据库连接池并不是数据库服务的内容,而是客户端应用程序创建的一种应用架构。

所以我们在数据库服务器上找不到什么开启数据库连接池的选项。

接下来将开启与不开启数据库连接池的区别。

使用数据库连接池

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;

namespace ConnectionPool
{
    class Program
    {
        static void Main(string[] args)
        {
            string connectionString3 = "Data Source=jackal-pc;Initial Catalog=xwdb;User Id=xuwei;Password=1234;";
            string connectionString2 = "Data Source=jackal-pc;Initial Catalog=xwdb;User Id=xuwei2;Password=xuwei2;";

            using (SqlConnection connection = new SqlConnection(connectionString3))
            {
                //打开连接
                connection.Open();
                Console.WriteLine("建立连接1");

                SqlCommand sqlcmd = connection.CreateCommand();
                sqlcmd.CommandText = "select @@version;";
                SqlDataReader sqlreader = sqlcmd.ExecuteReader();
            }

            using (SqlConnection connection = new SqlConnection(connectionString2))
            {
                //打开连接
                connection.Open();
                Console.WriteLine("建立连接2");

                SqlCommand sqlcmd = connection.CreateCommand();
                sqlcmd.CommandText = "select @@version;";
                SqlDataReader sqlreader = sqlcmd.ExecuteReader();
            }

            using (SqlConnection connection = new SqlConnection(connectionString3))
            {
                //打开连接
                connection.Open();
                Console.WriteLine("建立连接1");

                SqlCommand sqlcmd = connection.CreateCommand();
                sqlcmd.CommandText = "select @@version;";
                SqlDataReader sqlreader = sqlcmd.ExecuteReader();
            }

        }
    }
}

在connectiongString中数据库连接池默认就是开启的,也就是Pooling=true;只有要关闭数据库连接池的时候,才需要显示声明Pooling=false;

通过netmon抓取网络报如下

通过上图我们可以发现,三次连接,但是网络中只有两次连接,这是因为第三次连接字符串跟第一次一样,所以使用了数据连接池。我们可以看到最后的两次SQLBatch是连续的,两次SQLBatch之间没有TCP三次握手连接,因为连接池起了作用。

PS:三次握手错误纠正

在上图书我标示TSL:Handshake为TCP握手,这是错误的,真正的TCP握手应该是

  1. TCP:Flags=....S....
  2. TCP:Flags=....A..S
  3. TCP:Flags=....A....

不适用数据库连接池

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;

namespace ConnectionPool
{
    class Program
    {
        static void Main(string[] args)
        {
            string connectionString3 = "Data Source=jackal-pc;Initial Catalog=xwdb;User Id=xuwei;Password=1234;Pooling=false;";
            string connectionString2 = "Data Source=jackal-pc;Initial Catalog=xwdb;User Id=xuwei2;Password=xuwei2;Pooling=false;";

            using (SqlConnection connection = new SqlConnection(connectionString3))
            {
                //打开连接
                connection.Open();
                Console.WriteLine("建立连接1");

                SqlCommand sqlcmd = connection.CreateCommand();
                sqlcmd.CommandText = "select @@version;";
                SqlDataReader sqlreader = sqlcmd.ExecuteReader();
            }

            using (SqlConnection connection = new SqlConnection(connectionString2))
            {
                //打开连接
                connection.Open();
                Console.WriteLine("建立连接2");

                SqlCommand sqlcmd = connection.CreateCommand();
                sqlcmd.CommandText = "select @@version;";
                SqlDataReader sqlreader = sqlcmd.ExecuteReader();
            }

            using (SqlConnection connection = new SqlConnection(connectionString3))
            {
                //打开连接
                connection.Open();
                Console.WriteLine("建立连接1");

                SqlCommand sqlcmd = connection.CreateCommand();
                sqlcmd.CommandText = "select @@version;";
                SqlDataReader sqlreader = sqlcmd.ExecuteReader();
            }

        }
    }
}

如上图所示,有三次数据库连接,然后通过netmon抓取网络包发现又3次的TCP三次握手连接,这证明是没有使用连接池,每一次连接结束都会关闭连接。下次即使使用相同的连接也要重现新建连接。创建连接比较消耗资源,如果频繁地创建关闭连接会影响性能。

转载自:http://www.cnblogs.com/xwdreamer/archive/2012/08/07/2626610.html

时间: 2024-11-08 19:56:43

[转载].net下数据库连接池的相关文章

【转载】高性能数据库连接池的内幕

原文:高性能数据库连接池的内幕 中生代技术群分享第三十一期 讲师:何涛 编辑:友强 注:完美修订版 摘要:如何打造高性能的数据库连接池框架,可以从哪些角度进行优化,连接池的大量优化实践如何为你的系统保驾护航,本专题将带你走进连接池的世界,为你一一揭晓.    何涛 唯品会平台架构师 何涛,现任职于唯品会平台架构部,要负责数据访问层,网关,数据库中间件,平台框架等开发设计工作.在数据库性能优化,架构设计等方面有着大量的经验积累.热衷于高可用,高并发及高性能的架构研究. 大家可能会有这样疑问:连接池

PHP没有数据库连接池怎么破?PHP环境下使用Nginx ngx_http_limit_req_module模块的高负载解决方案

线上运行了一套辅助系统是利用了开源的PHP改的,之前也没怎么玩过PHP,没想到这玩意儿还是有不少坑的.突然某一天一个用户做线上活动推广,然后短时间内涌进来了上万的请求,然后数据库连接耗尽,短时间内几乎拖垮了整个系统.导致系统奔溃的有多方面原因,今天主要针对PHP没有数据库连接池的原因来分析. 在PHP里,数据库连接在请求到达时建立,请求结束时释放.如果同时几千个请求到达,那就同时会建立几千个数据库连接,非常恐怖.而且PHP木有比较好的数据库连接池驱动方案,所以我们得另想办法. 解决这种问题有三种

MVC设计模式((javaWEB)在数据库连接池下,实现对数据库中的数据增删改查操作)

设计功能的实现: ----没有业务层,直接由Servlet调用DAO,所以也没有事务操作,所以从DAO中直接获取connection对象 ----采用MVC设计模式 ----采用到的技术 .MVC设计模式,JSP,Servlet,POJO .数据库使用mysql .数据库连接池需要使用C3P0数据库连接池 .页面上的提示需要使用jQuery ----技术难点 .多个请求如何使用一个Servlet .如何模糊查询 .如何在创建和修改的情况下,验证用户信息是否已被使用,并给出提示 ---------

Java 数据库连接池—转载孤傲苍狼 http://www.cnblogs.com/xdp-gacl/p/4002804.html

一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出.拓机.如下图所示: 二.使用数据库连接池优化程序性能 2.1.数据库连接池的基本概念 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现的尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性

c++ 实现数据库连接池

c++ 实现数据库连接池 自己尝试用c++ 新标准实现了数据库连接池,代码简化了很多. 思路: 将数据库的连接当作一个对象添加进list队列中,在连接池创建的时候就建立好队列,并添加自定义大小的连接对象,连接对象用智能指针来管理(现代c++中不应该出现delete语句),避免类似内存泄漏等内存问题,智能指针上用lambda表达式注册了delete删除函数来释放连接资源,及时归还,(其中用了std::move来转移list中的对象所有权到函数里的临时智能指针对象,当离开作用域时,自动释放.) 关于

数据库连接池之Proxool使用

如果想要搭建一个高效的网站,链接池是必须用到的一部分.而连接池的选择是多种多样的.就现在的软件开发界而言,最为多用的是DBCP, c3p0, 和 proxool.而hibernate推荐使用的是c3p0 和proxool,并且宣布不再支持DBCP. 因此,重点就是如果想要在自己的应用程序中加入数据库连接池,就必须掌握其中的一种,而最好得选择就是c3p0和proxool中的任何一种. 下面来说说数据库连接池的相关概念和基本原理,以便于读者更加容易的理解后边的实际应用. 使用过数据库操作的人都知道,

【Java】java数据库连接池配置的几种方法

今天遇到了关于数据源连接池配置的问题,发现有很多种方式可以配置,现总结如下,希望对大家有所帮助:(已Mysql数据库为例) 一,Tomcat配置数据源: 方式一:在WebRoot下面建文件夹META-INF,里面建一个文件context.xml,内容如下: <Context>      <Resource name="jdbc/test" auth="Container" type="javax.sql.DataSource" 

数据库连接池的原理

这次我们采取技术演进的方式来谈谈数据库连接池的技术出现过程及其原理,以及当下最流行的开源数据库连接池jar包. 一.早期我们怎么进行数据库操作        1.原理:一般来说,java应用程序访问数据库的过程是: ①装载数据库驱动程序: ②通过jdbc建立数据库连接: ③访问数据库,执行sql语句: ④断开数据库连接.        2.代码  // 查询所有用户 [java] view plain copy print? Public void FindAllUsers(){ //1.装载s

一次项目实践中DBCP数据库连接池性能优化

关于数据库连接池DBCP的关注源于刚刚结束的一轮测试,测试内容是衡量某Webserver服务创建用户接口的性能.这是一款典型的tomcat应用,使用的测试工具是Grinder.DBCP作为tomcat服务器常用的数据库连接池,其性能表现直接关乎应用的性能. 1.遇到的问题 当并发量增加到100时,该接口出现瓶颈,此时TPS接近400,如下图.但是服务端CPU和内存等资源并未达到瓶颈,服务器CPU使用率仅为30%,内存使用率为40%.监控到的javaMethod慢方法为incrAppAccount