一種基于.net數(shù)據(jù)庫(kù)連接池的數(shù)據(jù)管理方法及系統(tǒng)的制作方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及數(shù)據(jù)庫(kù)技術(shù)領(lǐng)域,特別涉及一種基于.NET數(shù)據(jù)庫(kù)連接池的數(shù)據(jù)管理方法及系統(tǒng)。
【背景技術(shù)】
[0002]連接數(shù)據(jù)庫(kù)是應(yīng)用程序中耗費(fèi)大量資源且相對(duì)較慢的操作,但它們又是至關(guān)緊要的。連接池是已打開(kāi)的及可重用的數(shù)據(jù)庫(kù)連接的一個(gè)容器。連接池在所有的數(shù)據(jù)庫(kù)連接都關(guān)閉時(shí)才從內(nèi)存中釋放。使用連接池最基本的優(yōu)點(diǎn)是提高應(yīng)用程序的性能及可伸縮性,而其主要缺點(diǎn)是會(huì)有一個(gè)或多個(gè)數(shù)據(jù)庫(kù)連接將一直保持打開(kāi)狀態(tài),即使當(dāng)前不在使用。AD0.NET的Data Providers將默認(rèn)情況下將使用連接池,如果不想使用連接池,必須在連接字符串中指定” Polling = false”。
[0003]隨著互聯(lián)網(wǎng)的蓬勃發(fā)展,數(shù)據(jù)庫(kù)安全及穩(wěn)定越來(lái)越受到大家的青睞,目前同領(lǐng)域用的連接方式大致有:
[0004](I) JDBC數(shù)據(jù)庫(kù)連接池
[0005]原生態(tài)數(shù)據(jù)庫(kù)連接池,沒(méi)有對(duì)數(shù)據(jù)連接做任何的封裝,對(duì)應(yīng)開(kāi)發(fā)人員來(lái)說(shuō)帶來(lái)了很大的復(fù)雜度,開(kāi)發(fā)速度慢、程序復(fù)用少。(大部分企業(yè)對(duì)其作了基本能的封裝)
[0006](2) DBCP數(shù)據(jù)連接池
[0007]DBCP (DataBase connect1n pool),數(shù)據(jù)庫(kù)連接池。是 apache 上的一個(gè) java連接池項(xiàng)目,也是tomcat使用的連接池組件。單獨(dú)使用dbcp需要3個(gè)包:common_dbcp.jar, common-pool.jar, common-collect1ns, jar由于建立數(shù)據(jù)庫(kù)連接是一個(gè)非常耗時(shí)耗資源的行為,所以通過(guò)連接池預(yù)先同數(shù)據(jù)庫(kù)建立一些連接,放在內(nèi)存中,應(yīng)用程序需要建立數(shù)據(jù)庫(kù)連接時(shí)直接到連接池中申請(qǐng)一個(gè)就行,用完后再放回去。
[0008](3) c3p0
[0009]c3P0是一個(gè)開(kāi)源的JDBC連接池,它實(shí)現(xiàn)了數(shù)據(jù)源和JNDI綁定,支持JDBC3規(guī)范和JDBC2的標(biāo)準(zhǔn)擴(kuò)展。目前使用它的開(kāi)源項(xiàng)目有Hibernate,Spring等。
[0010](4).Net數(shù)據(jù)庫(kù)連接池
[0011]數(shù)據(jù)庫(kù)連接池取值一般是逐行進(jìn)行取值,這樣無(wú)法確定數(shù)據(jù)的準(zhǔn)確性,然而如果不正確地使用連接池可能給應(yīng)用程序帶來(lái)負(fù)效果,使用不當(dāng)連接池非但不是有益的而且是害的。
【發(fā)明內(nèi)容】
[0012]本發(fā)明的目的旨在至少解決所述技術(shù)缺陷之一。
[0013]為此,本發(fā)明的目的在于提出一種基于.NET數(shù)據(jù)庫(kù)連接池的數(shù)據(jù)管理方法及系統(tǒng),具有定位準(zhǔn)確,提升用戶體驗(yàn),響應(yīng)速度快、用戶體驗(yàn)速度快、用戶數(shù)據(jù)安全性以及提高應(yīng)用程序的效率及可伸縮性的特點(diǎn)。
[0014]為了實(shí)現(xiàn)上述目的,本發(fā)明一方面的實(shí)施例提供一種基于.NET數(shù)據(jù)庫(kù)連接池的數(shù)據(jù)管理方法,由.NET數(shù)據(jù)庫(kù)的數(shù)據(jù)庫(kù)管理系統(tǒng)執(zhí)行如下步驟:
[0015]所述數(shù)據(jù)庫(kù)管理系統(tǒng)根據(jù)第一次請(qǐng)求數(shù)據(jù)庫(kù)連接的連接字符串建立連接池,所述連接池包括多個(gè)空閑狀態(tài)的數(shù)據(jù)庫(kù)連接;
[0016]所述數(shù)據(jù)庫(kù)管理系統(tǒng)在接收到用戶的連接請(qǐng)求后,為所述連接請(qǐng)求創(chuàng)建一個(gè)線程;
[0017]所述線程向所述數(shù)據(jù)庫(kù)連接池發(fā)送連接申請(qǐng)請(qǐng)求;
[0018]所述數(shù)據(jù)庫(kù)管理系統(tǒng)在接收到所述線程的連接申請(qǐng)請(qǐng)求后,從所述連接池查找是否有空閑狀態(tài)的數(shù)據(jù)庫(kù)連接,如果有則向所述線程分配數(shù)據(jù)庫(kù)連接;
[0019]所述線程根據(jù)所述分配的所述數(shù)據(jù)庫(kù)連接進(jìn)行數(shù)據(jù)調(diào)用以執(zhí)行所述用戶的連接請(qǐng)求對(duì)應(yīng)的功能,其中,所述數(shù)據(jù)庫(kù)連接按照行列并取的方式進(jìn)行取值;
[0020]所述線程在執(zhí)行完成所述連接請(qǐng)求對(duì)應(yīng)的功能后,釋放所述數(shù)據(jù)庫(kù)連接至所述連接池。
[0021]進(jìn)一步,所述數(shù)據(jù)庫(kù)連接按照行列并取的方式進(jìn)行取值,包括:采用行列交叉方式進(jìn)行取值。
[0022]進(jìn)一步,所述連接池還包括:打開(kāi)狀態(tài)和可重用狀態(tài)的數(shù)據(jù)庫(kù)連接。
[0023]進(jìn)一步,所述數(shù)據(jù)庫(kù)管理系統(tǒng)在檢測(cè)到所述連接申請(qǐng)請(qǐng)求中攜帶有新的連接字符串時(shí),其中,該新的連接字符串與已建立的所述連接池對(duì)應(yīng)的第一次請(qǐng)求數(shù)據(jù)庫(kù)連接的連接字符串不同,則建立一個(gè)新的連接池,并從該新的連接池中分配數(shù)據(jù)庫(kù)連接以響應(yīng)攜帶有新的連接字符串的連接申請(qǐng)請(qǐng)求。
[0024]進(jìn)一步,還包括如下步驟:所述數(shù)據(jù)庫(kù)管理系統(tǒng)在檢測(cè)到用戶不操作數(shù)據(jù)庫(kù)時(shí),自動(dòng)釋放數(shù)據(jù)庫(kù)連接。
[0025]本發(fā)明另一方面的實(shí)施例提供一種基于.NET數(shù)據(jù)庫(kù)連接池的數(shù)據(jù)管理系統(tǒng),包括:連接池建立單元,用于根據(jù)第一次請(qǐng)求數(shù)據(jù)庫(kù)連接的連接字符串建立連接池,所述連接池包括多個(gè)空閑狀態(tài)的數(shù)據(jù)庫(kù)連接;線程創(chuàng)建單元,用于在接收到用戶的連接請(qǐng)求后,為所述連接請(qǐng)求創(chuàng)建一個(gè)線程;數(shù)據(jù)庫(kù)連接管理單元,用于在接收到所述線程的連接申請(qǐng)請(qǐng)求后,從所述連接池查找是否有空閑狀態(tài)的數(shù)據(jù)庫(kù)連接,如果有則向所述線程分配數(shù)據(jù)庫(kù)連接;其中,所述線程根據(jù)所述分配的所述數(shù)據(jù)庫(kù)連接進(jìn)行數(shù)據(jù)調(diào)用以執(zhí)行所述用戶的連接請(qǐng)求對(duì)應(yīng)的功能,其中,所述數(shù)據(jù)庫(kù)連接按照行列并取的方式進(jìn)行取值,所述線程在執(zhí)行完成所述連接請(qǐng)求對(duì)應(yīng)的功能后,釋放所述數(shù)據(jù)庫(kù)連接至所述連接池。
[0026]進(jìn)一步,所述數(shù)據(jù)庫(kù)連接按照行列并取的方式進(jìn)行取值,包括:采用行列交叉方式進(jìn)行取值。
[0027]進(jìn)一步,所述連接池還包括:打開(kāi)狀態(tài)和可重用狀態(tài)的數(shù)據(jù)庫(kù)連接。
[0028]進(jìn)一步,所述連接池建立單元還用于在檢測(cè)到來(lái)自線程的所述連接申請(qǐng)請(qǐng)求中攜帶有新的連接字符串時(shí),其中,該新的連接字符串與已建立的所述連接池對(duì)應(yīng)的第一次請(qǐng)求數(shù)據(jù)庫(kù)連接的連接字符串不同,則建立一個(gè)新的連接池,并由所述數(shù)據(jù)庫(kù)連接管理單元從該新的連接池中分配數(shù)據(jù)庫(kù)連接以響應(yīng)攜帶有新的連接字符串的連接申請(qǐng)請(qǐng)求。
[0029]進(jìn)一步,所述數(shù)據(jù)庫(kù)連接管理單元還用于在檢測(cè)到用戶不操作數(shù)據(jù)庫(kù)時(shí),自動(dòng)釋放數(shù)據(jù)庫(kù)連接。
[0030]根據(jù)本發(fā)明實(shí)施例的基于.NET數(shù)據(jù)庫(kù)連接池的數(shù)據(jù)管理方法及系統(tǒng),基于JDBC和.net技術(shù)相結(jié)合而編輯出來(lái)的一套數(shù)據(jù)庫(kù)連接工具,實(shí)現(xiàn)了跨平臺(tái)、跨領(lǐng)域,其拓展性,具有特殊的取值方式,普通的數(shù)據(jù)庫(kù)連接池取值一般是逐行取值,這樣數(shù)據(jù)的準(zhǔn)確性不能確定,本套數(shù)據(jù)庫(kù)連接池不但對(duì)數(shù)據(jù)庫(kù)連接量得到了最大優(yōu)化,而且對(duì)取數(shù)也做了特殊的處理(行列并取)保證數(shù)據(jù)的準(zhǔn)確性,而且當(dāng)數(shù)據(jù)庫(kù)沒(méi)有連接時(shí)會(huì)自動(dòng)釋放連接。本發(fā)明可以一次性讀取用戶發(fā)送請(qǐng)求的數(shù)據(jù),具有定位準(zhǔn)確,提升用戶體驗(yàn),響應(yīng)速度快、用戶體驗(yàn)速度快、用戶數(shù)據(jù)安全性以及提高應(yīng)用程序的效率及可伸縮性的特點(diǎn)。
[0031]本發(fā)明附加的方面和優(yōu)點(diǎn)將在下面的描述中部分給出,部分將從下面的描述中變得明顯,或通過(guò)本發(fā)明的實(shí)踐了解到。
【附圖說(shuō)明】
[0032]本發(fā)明的上述和/或附加的方面和優(yōu)點(diǎn)從結(jié)合下面附圖對(duì)實(shí)施例的描述中將變得明顯和容易理解,其中:
[0033]圖1為根據(jù)本發(fā)明實(shí)施例的基于.NET數(shù)據(jù)庫(kù)連接池的數(shù)據(jù)管理方法的流程圖;
[0034]圖2為根據(jù)本發(fā)明實(shí)施例的基于.NET數(shù)據(jù)庫(kù)連接池的數(shù)據(jù)管理方法的示意圖;
[0035]圖3為根據(jù)本發(fā)明實(shí)施例的基于.NET數(shù)據(jù)庫(kù)連接池的數(shù)據(jù)管理系統(tǒng)的結(jié)構(gòu)圖。
【具體實(shí)施方式】
[0036]下面詳細(xì)描述本發(fā)明的實(shí)施例,所述實(shí)施例的示例在附圖中示出,其中自始至終相同或類似的標(biāo)號(hào)表示相同或類似的元件或具有相同或類似功能的元件。下面通過(guò)參考附圖描述的實(shí)施例是示例性的,旨在用于解釋本發(fā)明,而不能理解為對(duì)本發(fā)明的限制。
[0037]如圖1所示,本發(fā)明實(shí)施例的基于.NET數(shù)據(jù)庫(kù)連接池的數(shù)據(jù)管理方法,是由.NET數(shù)據(jù)庫(kù)的數(shù)據(jù)庫(kù)管理系統(tǒng)執(zhí)行如下步驟:
[0038]步驟SI,數(shù)據(jù)庫(kù)管理系統(tǒng)根據(jù)第一次請(qǐng)求數(shù)據(jù)庫(kù)連接的連接字符串建立連接池。
[0039]具體地,一個(gè)連接池是通過(guò)一個(gè)唯一的連接字符串來(lái)創(chuàng)建。本步驟中,數(shù)據(jù)庫(kù)管理系統(tǒng)是根據(jù)第一次請(qǐng)求數(shù)據(jù)庫(kù)連接的連接字符串來(lái)創(chuàng)建的連接池。其中,連接池包括多個(gè)空閑狀態(tài)的數(shù)據(jù)庫(kù)連接。此外,連接池還可以包括:打開(kāi)狀態(tài)和可重用狀態(tài)的數(shù)據(jù)庫(kù)連接。
[0040]需要說(shuō)明的是,在同一時(shí)刻同一應(yīng)用程序域中可以有多個(gè)連接池,但連接池不可以跨應(yīng)用程序域共享。當(dāng)另外一個(gè)不同的連接字符串請(qǐng)求數(shù)據(jù)庫(kù)連接時(shí),將創(chuàng)建另一個(gè)連接池。因此一個(gè)連接字符中對(duì)應(yīng)一個(gè)連接池而不是一個(gè)數(shù)據(jù)庫(kù)對(duì)應(yīng)一個(gè)連接池。
[0041]在本發(fā)明的一個(gè)實(shí)施例中,數(shù)據(jù)庫(kù)管理系統(tǒng)在檢測(cè)到連接申請(qǐng)請(qǐng)求中攜帶有新的連接字符串時(shí),其中,該新的連接字符串與已建立的連接池對(duì)應(yīng)的第一次請(qǐng)求數(shù)據(jù)庫(kù)連接的連接字符串不同,則建立一個(gè)新的連接池,并從該新的連接池中分配數(shù)據(jù)庫(kù)連接以響應(yīng)攜帶有新的連接字符串的連接申請(qǐng)請(qǐng)求。
[0042]換言之,.Net數(shù)據(jù)庫(kù)的連接池是數(shù)據(jù)庫(kù)連接對(duì)象的容器,只要其中存在活動(dòng)的或打開(kāi)的連接它維持活動(dòng)狀態(tài)。當(dāng)使用一個(gè)連接字符串來(lái)請(qǐng)求數(shù)據(jù)庫(kù)連接時(shí),將分配一個(gè)新的連接池。通過(guò)在應(yīng)用程序中使用相同的連接字符串,可以提高應(yīng)用程序的性能和可伸縮性。
[0043]步驟S2,數(shù)據(jù)庫(kù)管理系統(tǒng)在接收到用戶的連接請(qǐng)求后,為該連接請(qǐng)求創(chuàng)建一個(gè)線程。
[0044]圖2為根據(jù)本發(fā)明實(shí)施例的基于.NET數(shù)據(jù)庫(kù)連接池的數(shù)據(jù)管理方法的示意圖。
[0045]如圖2所示,數(shù)據(jù)庫(kù)管理系統(tǒng)可以接收到一個(gè)或多個(gè)用戶的連接請(qǐng)求,例如圖2中的兩個(gè)用戶的連接請(qǐng)求。數(shù)據(jù)庫(kù)管理系統(tǒng)根據(jù)接收到兩個(gè)用戶(用戶I和用戶2)的連接請(qǐng)求,分別為每個(gè)連接請(qǐng)求創(chuàng)建一個(gè)線程,即線程I和線程2。
[0046]步驟S3,線程向數(shù)據(jù)庫(kù)連接池發(fā)送連接申請(qǐng)請(qǐng)求。
[0047]參考圖2,線程I和線程2分別根據(jù)各自對(duì)應(yīng)用戶的連接請(qǐng)求,向數(shù)據(jù)庫(kù)連接池發(fā)送連接申請(qǐng)請(qǐng)求,以申請(qǐng)連接。
[0048]步驟S4,數(shù)據(jù)庫(kù)管理系統(tǒng)在接收到線程的連接申請(qǐng)請(qǐng)求后,從連接池查找是否有空閑狀態(tài)的