前言介绍:

当应用程序运行的时候,会有一个连接池的管理控件运行在应用程序的进程里,统一管理应用程序和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. 使用Markdown编辑器写博客

    使用Markdown编辑器写博客 本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和图 ...

  2. drag and drop

    <!DOCTYPE HTML> <html> <head> <script type="text/javascript"> func ...

  3. 在C#中实现软件自动升级

    在C#中实现软件自动升级 winform程序相对web程序而言,功能更强大,编程更方便,但软件更新却相当麻烦,要到客户端一台一台地升级,本文结合实际情况,通过软件实现自动升级,弥补了这一缺陷,有较好的 ...

  4. java异步任务处理

    1.场景 最近做项目的时候遇到了一个小问题:从前台提交到服务端A,A调用服务端B处理超时,原因是前端一次请求往db插1万数据,插完之后会去清理缓存.发送消息. 服务端的有三个操作 a.插DB b.清理 ...

  5. java反射快速入门(二)

    上一遍博文 , 简单介绍java 反射的常用接口,本遍博文, 我会结合项目开发的实际例子讲解下 java反射的使用 现在有个需求, 要将一个对象转换成xml格式, 或者将一串xml转换一个对象, 这时 ...

  6. 解决MySQL连接超时Communications link failure due to underlying exception

    最近在用一个MySQL的Java连接池的过程中,连接一晚上不释放,第二天就会造成超时的错误,查了一下原因,原来是因为MySQL默认的空闲等待时间是8个小时,一旦空闲超过8个小时,就会抛出异常.异常文本 ...

  7. 最近看了点C++,分享一下我的进度吧!

    #include <iostream> #include <cmath> #include <iomanip> using namespace std; //Stu ...

  8. QQ强制视频聊天

    QQ强制视频聊天 http://ike.126.com   现在,使用QQ的用户已经非常多,QQ聊天已经成了大家的家常便饭,除了跟自己和朋友和同事等熟悉的人聊天外,跟陌生的网友聊天也占了相当大的比例, ...

  9. 在饼图上显示百分比值(报表生成器和 SSRS)

    在饼图上显示百分比值(报表生成器和 SSRS) 默认情况下,图例中显示了类别来标识每个值. 如果使用了类别标签标记饼图,则可能希望在图例中显示百分比. 注意 在 SQL Server Data Too ...

  10. java_类泛型承继方法

    package ming; class Apple3<T>{ private T info; public Apple3(){} public Apple3(T info){ this.i ...