前言介绍:

当应用程序运行的时候,会有一个连接池的管理控件运行在应用程序的进程里,统一管理应用程序和SQLSERVER建立的所有连接,

并且维护这些连接一直处于活动状态。当有用户发出一个connection open指令时连接池会在自己维护的连接池中找一个处于空闲状态

的连接放回自己管理的连接池里,给这个用户使用。当用户使用完毕后,发出connection close指令,连接池会把这个连接放回自己

管理的连接池里,让他重新处于空闲状态,而不是真的从SQL里登出。这样如果下次有用户需要相同连接,就可以重用这个连接,

而无须再去做物理连接了。就是说连接池是放在客户端的,是客户端机制

连接池内部:

连接池内部实际上就是一个线程池,这个线程池是由连接池的管理控件管理的(说白了就是:客户端数据库驱动程序)

客户端应用程序通过加载SQLSERVER的数据驱动控件做SQLSERVER连接。目前客户端数据库驱动程序主要有3种:

1、MDAC(微软数据访问组件) SQL2000的时候开始有的
 
2、SQLSERVER Native Client SQL2005开始引入的
 
3、Microsoft JDBC Provider  使用机制与MDAC和SQLSERVER Native Client不同

ADO跟ADO.NET使用的是SQLSERVER Native Client

有些人会问,这个线程池是不是Windows提供的线程池,因为Windows本来就有一个线程池。

本人觉得不是Windows的线程池,因为在连接字符串里面可以指定连接数,如果指定连接数

是32767(即SQLSERVER的最大连接数),应用程序依然可以运行,Windows的线程池

并没有32767那么多,具体数量我也忘记了。

所以线程池应该是控件自己实现的:控件创建一个线程池,然后创建连接字符串里指定的线程数然后放入线程池

同一个客户端数据库驱动程序实现的线程池只能给同样的利用该客户端数据库驱动程序连接SQLSERVER的程序使用

比如:JDBC的线程池只能给同样是JAVA的程序使用,SQLSERVER Native Client的线程池只能给ADO跟ADO.NET

程序使用!!!

多个应用程序使用同一个线程池,那么这些应用程序是如何区分和隔离的?

答案是通过应用程序的名字

比如有两个连接:他们的属性(程序名称)有所不同,那么连接池会创建两个物理连接而不是重用同一个连接

如果两个应用程序的连接字符串里指定了最大连接数是40000,那么管理控件就会创建80000个连接,然后

当应用程序发起连接的时候连接池根据应用程序名来区分该应用程序使用哪一个40000个连接

不明白的童鞋可以看下图,下图解释的会比较清楚

既然连连接池是应用程序开启的,那么如何清理连接池呢?

方法:重启应用程序(强制清理连接池)

最后有一个问题:

两个应用程序都指定连接池的最大连接数为40000,如果是这样的话应该SQLSERVER应该预先

保持了80000个活动连接,让应用程序连接进来,这样SQLSERVER应该会报错

SQLSERVER的最大连接数是32767

但是程序却捕获不了错误信息,那么SQLSERVER会不会一次打开80000个连接并

对这些连接进行维护呢?

答案在我的另一篇文章里:

非常老的话题 SQLSERVER连接池

http://www.cnblogs.com/lyhabc/articles/2797351.html

其实ODBC连接方式也使用了连接池的,大家可以在控制面板-》数据库(ODBC)里看到下面的选项

SQLSERVER连接池内部机制的更多相关文章

  1. 非常老的话题 SQLSERVER连接池

    原文:非常老的话题 SQLSERVER连接池 非常老的话题 SQLSERVER连接池 写这篇文章不是说要炒冷饭,因为园子里有非常非常多关于SQLSERVER连接池的文章,但是他们说的都是引用MSDN里 ...

  2. OkHttp3源码详解(五) okhttp连接池复用机制

    1.概述 提高网络性能优化,很重要的一点就是降低延迟和提升响应速度. 通常我们在浏览器中发起请求的时候header部分往往是这样的 keep-alive 就是浏览器和服务端之间保持长连接,这个连接是可 ...

  3. Java中数据库连接池原理机制的详细讲解以及项目连接数据库采用JDBC常用的几种连接方式

    连接池的基本工作原理 1.基本概念及原理 由上面的分析可以看出,问题的根源就在于对数据库连接资源的低效管理.我们知道,对于共享资源,有一个很著名的设计模式:资源池(Resource Pool).该模式 ...

  4. ADO.NET连接池机制

    为什么需要连接池 剖析一个技术第一个要问的是,这项技术为什么存在. 对于每一个到SQL Server的连接,都需要经历TCP/IP协议的三次握手,身份认证,在SQL Server里建立连接,分配资源等 ...

  5. imagepool前端图片加载管理器(JavaScript图片连接池)

    前言 imagepool是一款管理图片加载的JS工具,通过imagepool可以控制图片并发加载个数. 对于图片加载,最原始的方式就是直接写个img标签,比如:<img src="图片 ...

  6. JDBC连接池。。。转载

    1. 引言  近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及,计算机  应用程序已从传统的桌面应用转到Web应用.基于B/S(Browser/Server)架 ...

  7. DBCP、c3p0、Druid三大连接池区别

    DBCP.c3p0.Druid三大连接池区别 一.连接池优势 如果一个项目中如果需要多个连接,如果一直获取连接,断开连接,这样比较浪费资源: 如果创建一个池,用池来管理Connection,这样就可以 ...

  8. c3p0,dbcp与druid 三大连接池的区别[转]

    说到druid,这个是在开源中国开源项目中看到的,说是比较好的数据连接池.于是乎就看看.扯淡就到这. 下面就讲讲用的比较多的数据库连接池.(其实我最先接触的是dbcp这个) 1)DBCP DBCP是一 ...

  9. python socketpool:通用连接池(转)

    简介 在软件开发中经常要管理各种“连接”资源,通常我们会使用对应的连接池来管理,比如mysql数据库连接可以用sqlalchemy中的池来管理,thrift连接可以通过thriftpool管理,red ...

随机推荐

  1. 10段实用的HTML5代码

    1.HTML5编写的CSS ResetCSS Reset也可以写成Reset CSS,即重设浏览器样式. /*   html5doctor.com Reset Stylesheet (Eric Mey ...

  2. PT100测温函数

    PT100电阻值计算过程如下: 理论电压关系为:V3-V1=11(V2-V1).由于电阻等的误差原因,采用实际测量求平均值的方法得出实际放大倍数. 放大电路测量几组数据如下:其中V3-V1=Av(V2 ...

  3. [Objective-c 基础 - 2.6] @property和@synthesize

    Xcode编译器的特性,自动生成getter和setter   A.@property 自动生成某个成员变量的getter和setter的声明 变量的命名要求:以下划线开头 Student.h @in ...

  4. Packetbeat协议扩展开发教程(2)

    原文链接:http://elasticsearch.cn/article/53 书接上回:http://elasticsearch.cn/article/48 我们打开Packetbeat项目,看看里 ...

  5. 虚方法(virtual)和抽象方法(abstract)的区别

    注:本文转载自 http://www.cnblogs.com/michaelxu/archive/2008/04/01/1132633.html 虚方法和抽象方法都可以供派生类重写,它们之间有什么区别 ...

  6. c#操作sqlite(包含中文支持)

    一个朋友写的,拿来分享给大家,希望有用 原文 Codeusing System; using System.Data; using System.Text.RegularExpressions; us ...

  7. CentOS下系统时间同步和时区的修改和设置(用的这个)

    一.修正时区 rm -rf /etc/localtime #删除当前默认时区www.kwx.gd ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localt ...

  8. hdu3589 Jacobi symbol(二次剩余 数论题)

    本题的注意点:n=p1*p2*p3......Pm 解法:直接利用公式a^((p-1)/2)=(a/p)mod p 即可求解. #include<stdio.h> #include< ...

  9. Flash 无法输入中文的修正方法

    在某些运行模式或运行时环境中,Flash 有一个 Bug,文本框与键盘的交互模式会无法输入中文(包括日文等带有输入法状态栏的输入模式),只要对 TextField 文本框实例的 FocusEvent. ...

  10. 【转】rvm安装ruby,gem,rails,之后仍然无法找到rails命令

    转自:http://chinacheng.iteye.com/blog/1738036 rvm安装ruby和rails之后,ruby -v好使,gem -v好使.但是rails -v不好使,提示没有安 ...