SQLSERVER连接池内部机制
前言介绍:
当应用程序运行的时候,会有一个连接池的管理控件运行在应用程序的进程里,统一管理应用程序和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连接池内部机制的更多相关文章
- 非常老的话题 SQLSERVER连接池
原文:非常老的话题 SQLSERVER连接池 非常老的话题 SQLSERVER连接池 写这篇文章不是说要炒冷饭,因为园子里有非常非常多关于SQLSERVER连接池的文章,但是他们说的都是引用MSDN里 ...
- OkHttp3源码详解(五) okhttp连接池复用机制
1.概述 提高网络性能优化,很重要的一点就是降低延迟和提升响应速度. 通常我们在浏览器中发起请求的时候header部分往往是这样的 keep-alive 就是浏览器和服务端之间保持长连接,这个连接是可 ...
- Java中数据库连接池原理机制的详细讲解以及项目连接数据库采用JDBC常用的几种连接方式
连接池的基本工作原理 1.基本概念及原理 由上面的分析可以看出,问题的根源就在于对数据库连接资源的低效管理.我们知道,对于共享资源,有一个很著名的设计模式:资源池(Resource Pool).该模式 ...
- ADO.NET连接池机制
为什么需要连接池 剖析一个技术第一个要问的是,这项技术为什么存在. 对于每一个到SQL Server的连接,都需要经历TCP/IP协议的三次握手,身份认证,在SQL Server里建立连接,分配资源等 ...
- imagepool前端图片加载管理器(JavaScript图片连接池)
前言 imagepool是一款管理图片加载的JS工具,通过imagepool可以控制图片并发加载个数. 对于图片加载,最原始的方式就是直接写个img标签,比如:<img src="图片 ...
- JDBC连接池。。。转载
1. 引言 近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及,计算机 应用程序已从传统的桌面应用转到Web应用.基于B/S(Browser/Server)架 ...
- DBCP、c3p0、Druid三大连接池区别
DBCP.c3p0.Druid三大连接池区别 一.连接池优势 如果一个项目中如果需要多个连接,如果一直获取连接,断开连接,这样比较浪费资源: 如果创建一个池,用池来管理Connection,这样就可以 ...
- c3p0,dbcp与druid 三大连接池的区别[转]
说到druid,这个是在开源中国开源项目中看到的,说是比较好的数据连接池.于是乎就看看.扯淡就到这. 下面就讲讲用的比较多的数据库连接池.(其实我最先接触的是dbcp这个) 1)DBCP DBCP是一 ...
- python socketpool:通用连接池(转)
简介 在软件开发中经常要管理各种“连接”资源,通常我们会使用对应的连接池来管理,比如mysql数据库连接可以用sqlalchemy中的池来管理,thrift连接可以通过thriftpool管理,red ...
随机推荐
- Java持久化存储对象Properties的方法list、store、load
package FileDemo; import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStrea ...
- 射频识别技术漫谈(10)——识别号的格式变化【worldsing笔记】
从事RDID行业的朋友经常会遇到这样的情况,同一张ID卡,在不同厂家生产的读卡器上读出的识别号完全不一样,有时甚至差之千里.ID卡的识别号一般是在出厂时被固化在卡片的ROM里,本身是不会改变的,问题出 ...
- weblogic11g 安装——linux 无图形界面
weblogic11g 安装——linux下无weblogic安装图形界面 注意:此次安装,没做server.ip .系统规划 目的:学习weblogic11g 在linux下 无图形安装的过程 j ...
- IEnumerable、IEnumerator与yield的学习
我们知道数组对象可以使用foreach迭代进行遍历,同时我们发现类ArrayList和List也可以使用foreach进行迭代.如果我们自己编写的类也需要使用foreach进行迭代时该怎么办呢? IE ...
- linq to sql 扩展方法
老赵的博客:http://blog.zhaojie.me/2008/02/using-translate-method-and-modify-command-text-before-query-in- ...
- TableControl大小变化
TableControl跟随Form大小变化: 选中TableControl,而不是TablePage,右侧Layout: 可以对其设置居上.居下等位置
- go操作数据库 Go-SQL-Driver/MySQL 使用详解
go操作mysql的驱动包很多,这里讲解当下比较流行的Go-SQL-Driver/MySQL1.下载安装 执行下面两个命令: 下载:go get github.com/Go-SQL-Driver/My ...
- ORM之一:适合我的ORM
一.常见开源ORM框架 比喻:Kerosene ORM,DbLinq,Dapper,DynamicQuery,elinq,glinq,NPoco,Relinq,EF,ServiceStack.OrmL ...
- linux终端或者虚拟机SecureCRT窗体拖动之后,会自己主动收到一个Ctrl+C的命令
虚拟机中SecureCRT窗体每次鼠标划动和拖动窗体都会出现Crtl+C命令.导致远程Linux连接操作中断 经查找发现是本地机器里安装了相关软件快捷键导致.比方我的有道词典划词功能.取消划词就可以
- 详解Android ActionBar之二:ActionBar添加Tabs标签和下拉导航
本节主要讲解ActionBar如何添加Tabs标签和下拉导航. 一.添加标签 Tabs 在ActionBar中实现标签页可以实现android.app.ActionBar.TabListener ,重 ...