贛縣網(wǎng)站建設(shè)國(guó)內(nèi)新聞最新消息十條
?.NET開源 ORM 框架 SqlSugar 系列
- 【開篇】.NET開源 ORM 框架 SqlSugar 系列
- 【入門必看】.NET開源 ORM 框架 SqlSugar 系列
- 【實(shí)體配置】.NET開源 ORM 框架 SqlSugar 系列
- 【Db First】.NET開源 ORM 框架 SqlSugar 系列
- 【Code First】.NET開源 ORM 框架 SqlSugar 系列
- 【數(shù)據(jù)事務(wù)】.NET開源 ORM 框架 SqlSugar 系列
- 【連接池】.NET開源 ORM 框架 SqlSugar 系列-CSDN博客
1. ADO.NET?連接池
如何啟用和禁用連接池?
連接字符串中將連接池值 Pooling 設(shè)置為 true 或 yes,則會(huì)啟用連接池(默認(rèn)啟用)。
啟用后連接池后系統(tǒng)會(huì)根據(jù)并發(fā)情況將連接池保持在一個(gè)合理區(qū)間,讓性能最大化,并不會(huì)立馬清空。而是將他狀態(tài)更改為sleep。禁用連接池性能會(huì)差一些,open就打開連接池 close就關(guān)閉連接池。
1.1 Open()?
1、啟用連接池情況(默認(rèn))
先找有沒(méi)有睡眠的連接池有恢復(fù)連接池,如果沒(méi)有睡眠的連接池打開新的連接池
2、禁用連接池情況(需要字符串關(guān)閉)
打開新連接池
1.2 Close ()
1、啟用連接池情況(默認(rèn))
將現(xiàn)有連接池睡眠
2、禁用連接池情況(需要字符串關(guān)閉)
關(guān)閉連接池
1.3 dispose()
方法實(shí)際是和 close()做的同一件事,唯一區(qū)別是 dispose?會(huì)銷毀當(dāng)前C#對(duì)象
SqlSugar dispose后在打開不會(huì)報(bào)錯(cuò),原理如下:
var db = GetInstance();db.Open();Console.WriteLine(db.Ado.Connection.GetHashCode());db.Close();Console.WriteLine(db.Ado.Connection.GetHashCode());db.Dispose();//如果下次在使用db會(huì)new出新的SqlConnection和Ado.net不一樣Ado.net是直接報(bào)錯(cuò)Console.WriteLine(db.Ado.Connection.GetHashCode());
輸出結(jié)果如下:
唯一的區(qū)別是Dispose后在使用db,db對(duì)象會(huì)換成新的而不在是以前的,而close后在使用還是同一個(gè)db對(duì)象。
2、SqlConnection和連接池
SqlConnection?非線程安全對(duì)象,不同上下文要new不同對(duì)象
con.Open(); //請(qǐng)求數(shù)據(jù)庫(kù)連接池 查找有沒(méi)有 sleep 狀態(tài)的,沒(méi)有創(chuàng)建連接池
con.Close();//將當(dāng)前連接池狀態(tài)改為sleep , 如果長(zhǎng)時(shí)間不用會(huì)銷毀
上面的原理可以看出
1. 同一個(gè)對(duì)象多次 open?和 close?都是在現(xiàn)有的連接池里面去操作
2. 就算是多個(gè)SqlConnection不在同時(shí)間請(qǐng)求,也可能會(huì)用同一個(gè)連接池?
3.多個(gè)SqlConnection?并發(fā)操作會(huì)找有沒(méi)有空閑的連接池,沒(méi)有在創(chuàng)建
所以連接池在.NET中?微軟封裝的很好,很成熟?多數(shù).NET用戶都不知道是什么玩意兒。
連接超時(shí)設(shè)置
在連接池符串加上 Connection Timeout=10 ,默認(rèn)是30秒,單位秒
.NET中要配置連接池嗎?
?答:什么都不用配置只要學(xué)會(huì) open 和 close就行了?
3、SqlSugarClient原理
1.手動(dòng)釋放模式和SqlConnection原理一模一樣,底層就是用的SqlConnection并且需要注意線程安全
//創(chuàng)建數(shù)據(jù)庫(kù)對(duì)象 SqlSugarClient SqlSugarClient db = new SqlSugarClient(new ConnectionConfig(){ConnectionString = "Server=.xxxxx", DbType = DbType.SqlServer,IsAutoCloseConnection = false//手動(dòng)釋放 是長(zhǎng)連接 });//需要手動(dòng)using //或者//db.Open();//db.Close();
2.自動(dòng)釋放(推薦),說(shuō)白了不需要你去寫?using 或者 close和open
//創(chuàng)建數(shù)據(jù)庫(kù)對(duì)象 SqlSugarClient SqlSugarClient db = new SqlSugarClient(new ConnectionConfig(){ConnectionString = "Server=.xxxxx", DbType = DbType.SqlServer,IsAutoCloseConnection = true//自動(dòng)釋放});//寫代碼就不需要考慮 open close 直接用就行了
?情況1: 沒(méi)有事務(wù)的情況 ,每次操作自動(dòng)調(diào)用 open和close
?情況2:?有事務(wù)的情況下 ,開啟事務(wù)調(diào)用 open? 提交或者回滾事務(wù)調(diào)用 close
4、SqlSugarScope原理
它是對(duì) SqlSugarClient 的封裝讓他支持線程安全,并且在不同上下文自動(dòng)new?出?SqlSugarClient,在編寫代碼的時(shí)候不需要考慮他線程是否安全
什么是上下文?
異步情況:?在同一串a(chǎn)wait?中是一個(gè)上下文
同步情況:?在同一個(gè)線程是同一個(gè)上下文
同一個(gè)SqlSugarScope?做到了在同一個(gè)上下文共享一個(gè)對(duì)象,不同上下文自動(dòng)去NEW
5、如何驗(yàn)證是否釋放
默認(rèn)情況下只要超過(guò)100個(gè)請(qǐng)求沒(méi)關(guān)閉就會(huì)報(bào)錯(cuò),不同庫(kù)可能有差異
for (int i = 0; i < 501; i++){SqlSugarClient db = new SqlSugarClient(new ConnectionConfig(){DbType = DbType.Oracle,ConnectionString = Config.ConnectionString,IsAutoCloseConnection = false//設(shè)成關(guān)閉這個(gè)代碼會(huì)直接報(bào)錯(cuò)});db.Ado.GetInt("SELECT 1 from dual"); }//IsAutoCloseConnection=true 執(zhí)行成功//IsAutoCloseConnection=false 會(huì)出現(xiàn)連接池超時(shí)或者超過(guò)上限等錯(cuò)誤
6、總結(jié)
他們3者的關(guān)系應(yīng)該是這樣的:
- SqlSugarScope?底層+自動(dòng)釋放+上下文安全
- SqlSugarClient? 底層+自動(dòng)釋放控制
- SqlConnection? ?底層