西西軟件園多重安全檢測(cè)下載網(wǎng)站、值得信賴的軟件下載站!
軟件
軟件
文章
搜索

首頁(yè)西西教程數(shù)據(jù)庫(kù)教程 → 多線程手動(dòng)創(chuàng)建數(shù)據(jù)庫(kù)連接池、減少sql Server的CPU和內(nèi)存占用

多線程手動(dòng)創(chuàng)建數(shù)據(jù)庫(kù)連接池、減少sql Server的CPU和內(nèi)存占用

相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來(lái)源:西西整理時(shí)間:2013/2/6 10:14:54字體大。A-A+

作者:易水寒2012點(diǎn)擊:224次評(píng)論:1次標(biāo)簽: sqlServer

SQL Server 2017 Developer版64位中文離線安裝包
  • 類型:服務(wù)器區(qū)大小:528.6M語(yǔ)言:多國(guó)語(yǔ)言[中文] 評(píng)分:10.0
  • 標(biāo)簽:
立即下載

改進(jìn)前分析:

由于之前做的項(xiàng)目占用sqlserver太多,程序運(yùn)行時(shí),導(dǎo)致sqlserver占用CPU 60%左右,內(nèi)存占用1.6G左右,這種情況下可能會(huì)導(dǎo)致服務(wù)器的宕機(jī)或其它軟件無(wú)法正常運(yùn)行。而程序本身并沒(méi)有占用太多CPU和內(nèi)存。于是為減少sqlserver的占用,先后使用了兩個(gè)解決辦法:數(shù)據(jù)庫(kù)連接池和數(shù)據(jù)緩沖池。

由于是在多線程環(huán)境下,必須要保證數(shù)據(jù)同步。而本人對(duì)EF沒(méi)有深入研究,所以只好自己寫。

數(shù)據(jù)庫(kù)連接池思路:

1、當(dāng)前軟件中必須有且只有一個(gè)數(shù)據(jù)庫(kù)連接池,所以使用單例模式進(jìn)行定義。

2、為方便調(diào)用,方法使用static定義。

4、調(diào)用DBConnPool(數(shù)據(jù)庫(kù)連接池)時(shí),必須保證已經(jīng)初始化必要的字段,而本類是靜態(tài)類,所以使用靜態(tài)構(gòu)造方法,在靜態(tài)構(gòu)造方法中初始化必要的變量。

3、數(shù)據(jù)庫(kù)連接們(sqlconneciton s)必須存儲(chǔ)到一個(gè)字段中,這個(gè)字段是隨時(shí)增長(zhǎng)的(在小于最大連接數(shù)時(shí)),所以我使用的是List<Sqlconnection>。

4、一個(gè)連接在同一時(shí)間只能由一個(gè)代碼調(diào)用,所以必須有屬性加以區(qū)分,所以封裝了自己的mySqlconn,里面包含兩個(gè)字段:sqlconnection 和bool IsUsed,當(dāng) 當(dāng)前連接正在使用時(shí),IsUsed=true,使用完畢IsUsed=false;另外,一般在DBHelper中,我們習(xí)慣使用using將sqlconnection包括起來(lái),以便達(dá)到手動(dòng)后釋放的效果,這里有兩個(gè)解決方法:

4.1:mySqlconn實(shí)現(xiàn)IDsipose接口,在dispose中 ,將IsUsed設(shè)置為false;

4.2:不適用using,在sqlconnection使用完畢后,調(diào)用MySqlconn的Isused設(shè)置為false。本人使用的是這種方法。不過(guò)這兩種理論上都可以。

5、本程序中沒(méi)有用到事務(wù)處理,所以不對(duì)此進(jìn)行設(shè)置,此思路和遠(yuǎn)嗎也僅僅是針對(duì)當(dāng)前項(xiàng)目。

總結(jié):數(shù)據(jù)庫(kù)連接池整個(gè)的流程就是

1、調(diào)用DBConnPool(數(shù)據(jù)庫(kù)連接池)獲取一個(gè)數(shù)據(jù)庫(kù)連接。

2、如果是第一次調(diào)用則首先調(diào)用DBConnPool的靜態(tài)構(gòu)造函數(shù),對(duì)類進(jìn)行初始化。

3、獲取數(shù)據(jù)庫(kù)連接

3.1、加鎖(線程間同步)

3.2、從List<MyConn>中獲取一個(gè)MyConn.IsUsed屬性為false的MyConn對(duì)象。如果沒(méi)有則返回Null

3.2、判斷返回的MyConn對(duì)象是否為null,如果為null,則判斷List<MyConn>.Count是否大于最大數(shù)據(jù)庫(kù)連接數(shù),如果大于,則sleep線程,并再次獲取,如果小于,則創(chuàng)建新的MyConn對(duì)象,并將其放入到List集合中。

3.3、將得到的MyConn對(duì)象的IsUsed設(shè)置為true。

3.4、解鎖

3.5、返回MyConn對(duì)象

4、MyConn對(duì)象使用完畢,設(shè)置MyConn.IsUsed為false。

貼上部分代碼:


 1  public static MySqlConn GetConn()
 2         {
 3             MySqlConn conn = null;
 4 
 5             lock (syncget)
 6             {
 7                 if (listMySqlConn == null)
 8                 {
 9                     listMySqlConn = new List<MySqlConn>();
10                 }
11                 if (listMySqlConn.Count > 0)
12                 {
13                     conn = getConnFromCollection();
14 
15                     while (conn == null)
16                     {
17                         if (listMySqlConn.Count >= maxNum)
18                         {
19                             System.Threading.Thread.Sleep(200);
20                             conn = getConnFromCollection();
21                         }
22                         else
23                         {
24                             conn = new MySqlConn(listMySqlConn.Count, new SqlConnection(connstr));
25                             listMySqlConn.Add(conn);
26                         }
27                     }
28                 }
29                 else
30                 {
31                     conn = new MySqlConn(listMySqlConn.Count,new SqlConnection(connstr));
32                     listMySqlConn.Add(conn);
33                 }
34                 conn.IsUsed = true;
35                 if (conn.Sqlconn.State!=ConnectionState.Open)
36                 {
37                     conn.Sqlconn.Open();
38                 }
39             }
40             return conn;
41         }
42 
43         private static MySqlConn getConnFromCollection()
44         {
45             MySqlConn conn = null;
46             foreach (MySqlConn item in listMySqlConn)
47             {
48                 if (!item.IsUsed)
49                 {
50                     conn = item;
51                     break;
52                 }
53             }
54             return conn;
55         }




下一次再寫多線程環(huán)境下數(shù)據(jù)緩沖池的

    相關(guān)評(píng)論

    閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過(guò)難過(guò)
    • 5 囧
    • 3 圍觀圍觀
    • 2 無(wú)聊無(wú)聊

    熱門評(píng)論

    最新評(píng)論

    發(fā)表評(píng)論 查看所有評(píng)論(1)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過(guò)審核才能顯示)