多執行緒環境下,手動建立資料庫連線池

2022-02-22 17:33:13 字數 2071 閱讀 9926

改進前分析:

由於之前做的專案占用sqlserver太多,程式執行時,導致sqlserver占用cpu 60%左右,記憶體占用1.6g左右,這種情況下可能會導致伺服器的宕機或其它軟體無法正常執行。而程式本身並沒有占用太多cpu和記憶體。於是為減少sqlserver的占用,先後使用了兩個解決辦法:資料庫連線池和資料緩衝池。

由於是在多執行緒環境下,必須要保證資料同步。而本人對ef沒有深入研究,所以只好自己寫。

資料庫連線池思路:

1、當前軟體中必須有且只有乙個資料庫連線池,所以使用單例模式進行定義。

2、為方便呼叫,方法使用static定義。

4、呼叫dbconnpool(資料庫連線池)時,必須保證已經初始化必要的字段,而本類是靜態類,所以使用靜態構造方法,在靜態構造方法中初始化必要的變數。

3、資料庫連線們(sqlconneciton s)必須儲存到乙個欄位中,這個欄位是隨時增長的(在小於最大連線數時),所以我使用的是list。

4、乙個連線在同一時間只能由乙個**呼叫,所以必須有屬性加以區分,所以封裝了自己的mysqlconn,裡面包含兩個字段:sqlconnection 和bool isused,當 當前連線正在使用時,isused=true,使用完畢isused=false;另外,一般在dbhelper中,我們習慣使用using將sqlconnection包括起來,以便達到手動後釋放的效果,這裡有兩個解決方法: 4.1:mysqlconn實現idsipose介面,在dispose中 ,將isused設定為false;

4.2:不適用using,在sqlconnection使用完畢後,呼叫mysqlconn的isused設定為false。本人使用的是這種方法。不過這兩種理論上都可以。

5、本程式中沒有用到事務處理,所以不對此進行設定,此思路和遠嗎也僅僅是針對當前專案。

總結:資料庫連線池整個的流程就是

1、呼叫dbconnpool(資料庫連線池)獲取乙個資料庫連線。

2、如果是第一次呼叫則首先呼叫dbconnpool的靜態建構函式,對類進行初始化。

3、獲取資料庫連線

3.1、加鎖(執行緒間同步)

3.2、從list中獲取乙個myconn.isused屬性為false的myconn物件。如果沒有則返回null

3.2、判斷返回的myconn物件是否為null,如果為null,則判斷list.count是否大於最大資料庫連線數,如果大於,則sleep執行緒,並再次獲取,如果小於,則建立新的myconn物件,並將其放入到list集合中。

3.3、將得到的myconn物件的isused設定為true。

3.4、解鎖

3.5、返回myconn物件

4、myconn物件使用完畢,設定myconn.isused為false。

貼上部分**:

view code

1

public

static

mysqlconn getconn()211

if (listmysqlconn.count > 0)12

22else

2327}28

}29else

3034 conn.isused = true;35

if (conn.sqlconn.state!=connectionstate.open)

3639}40

return

conn;41}

4243

private

static

mysqlconn getconnfromcollection()

4453}54

return

conn;

55 }

這個思路中沒有涉及資料庫連線池的關閉,由於本人這個專案是定時更新程式,每隔幾分鐘就要更新一次的,所以沒有設定。

不過可以提供乙個思路,在myconn中增加乙個欄位lastusetime,記錄本連線上次使用時間。

在dbconnpool中定義乙個system.threading.timer 變數,每隔2秒迴圈當前資料庫集合,如果發現當前項上次使用時間距離現在超過5分鐘,則將其銷毀。(如有更好方法,請告訴我,不勝感激..)

下一次再寫多執行緒環境下資料緩衝池的

XP下手動建立資料庫

1 準備初始化引數檔案initorcl.ora,將其儲存在 e oracle product 10.2.0 admin orcl pfile 內容如下 2準備建庫指令碼createdb.sql,將其儲存在 e oracle product 10.2.0 admin orcl pfile,內容如下 c...

手動建立資料庫步驟

兩種方式建立資料庫 一.使用dbca工具建立 dbca有兩種執行模式,一種是圖形化介面 互動模式 一種是命令介面 靜默安裝 dbca命令列模式安裝 例 dbca silent createdatabase templatename general purpose.dbc gdbname ora11g...

Linux下手工建立Oracle資料庫

oracle資料庫主要有instance和database組成。只要把spfile建立好,instance基本就可以啟動了,剩下就把database的三大檔案 控制檔案 資料檔案 日誌檔案 建立好,最後進行一些善後處理,基本就完成了建立工作。所以我把建立資料庫總結為乙個變數 兩個檔案,三條語句,外加...