成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何主動清空.Net數(shù)據(jù)庫連接池?

運維 數(shù)據(jù)庫運維
一般我們的項目中會使用1到2個數(shù)據(jù)庫連接配置,同程藝龍的數(shù)據(jù)庫連接配置被收攏到統(tǒng)一的配置中心,由DBA統(tǒng)一維護(hù),業(yè)務(wù)方通過某個配置字符串拿到的是開箱即用的Connection對象。

[[417053]]

本文轉(zhuǎn)載自微信公眾號「精益碼農(nóng)」,作者小碼甲。轉(zhuǎn)載本文請聯(lián)系精益碼農(nóng)公眾號。

一般我們的項目中會使用1到2個數(shù)據(jù)庫連接配置,同程藝龍的數(shù)據(jù)庫連接配置被收攏到統(tǒng)一的配置中心,由DBA統(tǒng)一維護(hù),業(yè)務(wù)方通過某個配置字符串拿到的是開箱即用的Connection對象。

DBA能在對業(yè)務(wù)方無侵入的情況下,給業(yè)務(wù)方切換備份數(shù)據(jù)庫,之后DBA要求舊連接池必須立即被清空。

那么問題來了: 能不能立即清空.NET連接池?注意我用得是清空,而不是釋放連接。

如果有同學(xué)不知道DBA做這個要求的目的,那我啰嗦一下:

應(yīng)用程序不再使用舊連接時,理論上你的連接池要被完全清空,因為單純的釋放連接,只會讓連接池中的Connection處于Sleep狀態(tài),依舊維持了短時間的物理連接,這個短時間其實是不必要的占用,影響了舊連接數(shù)據(jù)庫的吞吐量。

連接池知識背景

回答這個問題之前, 我們還是先研究一下.NET數(shù)據(jù)庫連接池。

1. .NET數(shù)據(jù)庫連接池的背景

數(shù)據(jù)庫連接是一個耗時的行為,大多數(shù)應(yīng)用程序只使用1到幾種數(shù)據(jù)庫連接,為了最小化打開連接的成本,ado.net使用了一種稱為連接池的優(yōu)化技術(shù)。

2. .NET 數(shù)據(jù)庫連接池的表現(xiàn)

數(shù)據(jù)庫連接池減少了必須打開新連接的次數(shù),池程序維護(hù)了數(shù)據(jù)庫物理連接。

通過為每個特定的連接配置保持一組活動的連接對象來管理連接。

每當(dāng)應(yīng)用程序嘗試Open連接,池程序就會在池中找到可用的連接,如果有則返回給調(diào)用者;

應(yīng)用程序Close連接對象時,池程序?qū)⑦B接對象返回到池中(Sleep), 這個連接可以在下一次Open調(diào)用中重用。

看黑板,下面是這次的重點:

3. .NET是如何形成數(shù)據(jù)庫連接池的?

只有相同的連接配置才能被池化,.NET為不同的配置維護(hù)了不同的連接池。

  • 相同的配置限制為:
  • 進(jìn)程相同、
  • 連接字符串相同、
  • 連接字符串關(guān)鍵key順序相同。

(連接字符串提供的關(guān)鍵字順序不同也將被分到不同的池)。

連接池中的可用連接的數(shù)量由連接字符串Max Pool Size決定。

在一個應(yīng)用程序中,有如下代碼:

  1. using (SqlConnection connection = new SqlConnection(   
  2.   "Integrated Security=SSPI;Initial Catalog=Northwind"))   
  3.     {   
  4.         connection.Open(); 
  5.         // Pool A is created.   
  6.     }   
  7.    
  8. using (SqlConnection connection = new SqlConnection(   
  9.   "Integrated Security=SSPI;Initial Catalog=pubs"))   
  10.     {   
  11.         connection.Open(); 
  12.         // Pool B is created because the connection strings differ.   
  13.     }   
  14.    
  15. using (SqlConnection connection = new SqlConnection(   
  16.   "Integrated Security=SSPI;Initial Catalog=Northwind"))   
  17.     {   
  18.         connection.Open(); 
  19.         // The connection string matches pool A.   
  20.     }   

上面創(chuàng)建了三個Connection對象,但是只形成了兩個數(shù)據(jù)庫連接池。

還是以上代碼,如果有兩個相同的應(yīng)用程序,理論上就形成了四個數(shù)據(jù)庫連接池。

4. 連接池中的連接什么時候被移除?

連接池中的連接空閑4-8 分鐘,池程序會移除這個連接。

應(yīng)用程序下線,連接池直接被清空。

如何主動清空.NET連接池

有了以上知識背景,我們再來回顧一下DBA的要求,切換數(shù)據(jù)庫連接配置的時候,清空原連接池。

.NET提供了 ClearAllPools、ClearPool靜態(tài)方法用于清空連接池。

  • ClearAllPools: 清空與這個DBProvider相關(guān)的所有連接池
  • ClearPool(DBConnection conn) 清空與這個連接對象相關(guān)的連接池

很明顯,我們這次要使用ClearPool(DBConnection conn) 方法。

光說不練不驗證,不是我的風(fēng)格。

天錘壓測/queryapi 產(chǎn)生一個包含大量連接對象的連接池;

適當(dāng)?shù)臅r候,調(diào)用/clearpoolapi清空連接池。

  1. public class MySqlController : Controller 
  2.    { 
  3.        // GET: MySql 
  4.        [Route("query")] 
  5.        public string Index() 
  6.        { 
  7.            var s = "User ID=teinfra_neo_netreplay;Password=123456;DataBase=teinfra_neo_netreplay;Server=10.100.41.196;Port=3980;Min Pool Size=1;Max Pool Size=28;CharSet=utf8;"
  8.            using (var conn = new MySqlConnection(s)) 
  9.            { 
  10.                var comm = conn.CreateCommand(); 
  11.                comm.CommandText = "select count(*) from usertest;"
  12.                conn.Open(); 
  13.                var ret = comm.ExecuteScalar(); 
  14.  
  15.                comm.CommandText = "select count(*) from information_schema.PROCESSLIST WHERE HOST like  '10.22.12.245%';"
  16.                var len = comm.ExecuteScalar(); 
  17.                return $"查詢結(jié)果:{ret} ,順便查一下當(dāng)前連接池的連接對象個數(shù): {len}"
  18.            }; 
  19.        } 
  20.  
  21.        [Route("clearpool")] 
  22.        public string Switch() 
  23.        { 
  24.            var s = "User ID=teinfra_neo_netreplay;Password=123456;DataBase=teinfra_neo_netreplay;Server=10.100.41.196;Port=3980;Min Pool Size=1;Max Pool Size=28;CharSet=utf8;"
  25.            using (var conn = new MySqlConnection(s)) 
  26.            { 
  27.                conn.Open(); 
  28.                MySqlConnection.ClearPool(conn); 
  29.            }; 
  30.  
  31.            using (var conn = new MySqlConnection(s)) 
  32.            { 
  33.                conn.Open(); 
  34.                var comm = conn.CreateCommand(); 
  35.                comm.CommandText = "select count(*) from information_schema.PROCESSLIST WHERE HOST like  '10.22.12.245%';"
  36.                var len = comm.ExecuteScalar(); 
  37.                return $"之前已經(jīng)清空連接池, 此次查詢連接池有 {v1}  個連接對象"
  38.            } 
  39.  
  40.        } 
  41.    } 

1.壓測產(chǎn)生大量連接對象

2. mysql數(shù)據(jù)庫對比

mysql的連接數(shù)查詢命令: (host是web服務(wù)器IP):

  1. select * from information_schema.PROCESSLIST WHERE HOST like '10.22.12.245%'

3. 調(diào)用/clearpoolapi,清空連接池

bingo,清空連接池的理論得到驗證。

旁白

這是我在同程藝龍最近爬的比較深的坑位, 在本次實踐中我們了解到:

  • NET 數(shù)據(jù)庫連接池屬編程語言范疇,連接池維護(hù)了物理連接
  • NET數(shù)據(jù)庫連接池的定義方式:(同一進(jìn)程、同一連接字符串、同一連接字符串關(guān)鍵key順序一致) 被劃到一個池
  • DB客戶端查詢當(dāng)前連接數(shù)的方式

根據(jù)這個思路改造祖?zhèn)鞔a,.NET數(shù)據(jù)獲取組件SDK 已經(jīng)滿足了DBA的要求。

希望本文設(shè)計考量、理論+論證的行文思路對讀者有所幫助, 距離上次發(fā)文一月有余,再次感謝5000+讀者不離不棄。

引用鏈接 

[1] sql連接池(ado.net): https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql-server-connection-pooling

 

責(zé)任編輯:武曉燕 來源: 精益碼農(nóng)
相關(guān)推薦

2009-06-24 07:53:47

Hibernate數(shù)據(jù)

2009-07-29 09:33:14

ASP.NET數(shù)據(jù)庫連

2009-06-26 14:41:48

ADO.NET

2010-03-18 15:09:15

python數(shù)據(jù)庫連接

2011-07-29 15:11:42

WeblogicOracle數(shù)據(jù)庫連接

2009-11-12 08:59:18

ADO.NET數(shù)據(jù)庫連

2017-06-22 14:13:07

PythonMySQLpymysqlpool

2019-11-27 10:31:51

數(shù)據(jù)庫連接池內(nèi)存

2009-06-16 09:25:31

JBoss配置

2009-06-15 13:46:00

netbeans設(shè)置數(shù)據(jù)庫連接池

2020-04-30 14:38:51

數(shù)據(jù)庫連接池線程

2018-10-10 14:27:34

數(shù)據(jù)庫連接池MySQL

2019-12-30 15:30:13

連接池請求PHP

2024-01-10 08:17:50

HikariCP數(shù)據(jù)庫Spring

2011-05-19 09:53:33

數(shù)據(jù)庫連接池

2018-01-03 14:32:32

2025-01-16 10:30:49

2009-07-17 13:32:49

JDBC數(shù)據(jù)庫

2010-03-18 14:55:17

Python數(shù)據(jù)庫連接

2010-01-05 10:11:23

ADO.NET連接池
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 中文字幕第十一页 | 日韩成人在线播放 | 国产免费视频在线 | 久久偷人 | 国产欧美一区二区三区日本久久久 | 成人午夜免费在线视频 | 欧美国产精品 | 国产成人精品久久二区二区 | 日韩视频精品 | 成人国产精品 | 日韩欧美亚洲综合 | 日本不卡一二三 | 在线播放国产一区二区三区 | 国产成人综合一区二区三区 | 免费一级黄色电影 | 中文字幕高清 | 亚洲精品一区国产精品 | 天天色图 | 91精品国产综合久久久久久丝袜 | 中文字幕日韩欧美 | 精品欧美一区二区三区久久久小说 | 国产精品一区二区三区久久久 | 最新国产视频 | 久久在线 | 精品久久一区 | 欧美福利在线 | 国产高清一区二区 | 九九在线视频 | 成人精品鲁一区一区二区 | 久久久久国产一级毛片高清网站 | www.av在线| 欧美成人精品欧美一级 | 中文字幕av网站 | 在线一区视频 | 国产精品福利在线 | 国产精品久久久久久久午夜片 | 国产精品久久久久一区二区 | 99免费视频 | 国产成人在线观看免费 | 国产aⅴ爽av久久久久久久 | 国产精品一区二区欧美黑人喷潮水 |