當應用程序運行的時候,會有一個連接池的管理控件運行在應用程序的進程裡,統一管理應用程序和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個連接
不明白的童鞋可以看下圖,下圖解釋的會比較清楚