欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
基于JDBC的數據庫連接池高效管理策略
在基于JDBC的數據庫應用開(kāi)發(fā)中,數據庫連接的管理是一個(gè)難點(diǎn),因為它是決定該應用性能的一個(gè)重要因素。本文在對數據庫連接進(jìn)行透徹分析的基礎上,提出并實(shí)現了一個(gè)高效的連接管理策略,使得開(kāi)發(fā)高性能的數據庫應用變得相對容易。特別是,對于連接管理中的兩個(gè)難點(diǎn):事務(wù)和多線(xiàn)程問(wèn)題進(jìn)行了深入的剖析,并給出了一個(gè)基于設計模式的解決方案。
介紹

在使用Java語(yǔ)言進(jìn)行和數據庫有關(guān)的的應用開(kāi)發(fā)中,一般都使用JDBC來(lái)進(jìn)行和數據庫的交互,其中有一個(gè)關(guān)鍵的概念就是Connection(連接),它在Java中是一個(gè)類(lèi),代表了一個(gè)通道。通過(guò)它,使用數據的應用就可以從數據庫訪(fǎng)問(wèn)數據了。

對于一個(gè)簡(jiǎn)單的數據庫應用,由于對于數據庫的訪(fǎng)問(wèn)不是很頻繁。這時(shí)可以簡(jiǎn)單地在需要訪(fǎng)問(wèn)數據庫時(shí),就新創(chuàng )建一個(gè)連接,用完后就關(guān)閉它,這樣做也不會(huì )帶來(lái)什么明顯的性能上的開(kāi)銷(xiāo)。但是對于一個(gè)復雜的數據庫應用,情況就完全不同了。頻繁的建立、關(guān)閉連接,會(huì )極大的減低系統的性能,因為對于連接的使用成了系統性能的瓶頸。

本文給出的方法可以有效的解決這個(gè)問(wèn)題。在本方法中提出了一個(gè)合理、有效的連接管理策略,避免了對于連接的隨意、無(wú)規則的使用。該策略的核心思想是:連接復用。通過(guò)建立一個(gè)數據庫連接池以及一套連接使用管理策略,使得一個(gè)數據庫連接可以得到高效、安全的復用,避免了數據庫連接頻繁建立、關(guān)閉的開(kāi)銷(xiāo)。另外,由于對JDBC中的原始連接進(jìn)行了封裝,從而方便了數據庫應用對于連接的使用(特別是對于事務(wù)處理),提高了開(kāi)發(fā)效率,也正是因為這個(gè)封裝層的存在,隔離了應用的本身的處理邏輯和具體數據庫訪(fǎng)問(wèn)邏輯,使應用本身的復用成為可能。

問(wèn)題產(chǎn)生

我參與的項目是開(kāi)發(fā)一個(gè)網(wǎng)管系統,不可避免的要和數據庫打交道。剛開(kāi)始時(shí),由于對于數據庫的訪(fǎng)問(wèn)不是很頻繁,對于數據庫連接的使用就是簡(jiǎn)單的需要時(shí)就建立,用完就關(guān)閉的策略,這很符合XP(eXtreme Programming)的口號:"Do the Simplest Thing that Could Possibly Work"。確實(shí),開(kāi)始時(shí)工作的很好。隨著(zhù)項目的進(jìn)展,對于數據庫的訪(fǎng)問(wèn)開(kāi)始變的頻繁,問(wèn)題就暴露出來(lái)了,原先的通過(guò)簡(jiǎn)單地獲取和關(guān)閉數據庫連接的方法將很大的影響系統的性能,這種影響是由于數據庫資源管理器進(jìn)程頻繁的創(chuàng )建和摧毀那些連接對象而引起的。

此時(shí),就有必要對數據庫訪(fǎng)問(wèn)方法進(jìn)行重構(refactoring),因為我們確實(shí)需要進(jìn)行改進(jìn),來(lái)提高系統的性能。

解決方案

可以看出,問(wèn)題的根源就是由于對于連接資源的低效管理造成的。對于共享資源,有一個(gè)很著(zhù)名的設計模式:資源池。該模式正是為了解決資源頻繁分配、釋放所造成的問(wèn)題的。把該模式應用到數據庫連接管理領(lǐng)域,就是建立一個(gè)數據庫連接池,提供一套高效的連接分配、使用策略,最終目標是實(shí)現連接的高效、安全的復用。

3.1、建立連接池

第一步,就是要建立一個(gè)靜態(tài)的連接池,所謂靜態(tài)是指,池中的連接是在系統初始化時(shí)就分配好的,并且不能夠隨意關(guān)閉的。Java中給我們提供很多容器類(lèi)可以方便的用來(lái)構建連接池,如:Vector、Stack等。在系統初始化時(shí),根據配置創(chuàng )建連接并放置在連接池中,以后所使用的連接都是從該連接池中獲取的,這樣就可以避免連接隨意建立、關(guān)閉造成的開(kāi)銷(xiāo)(當然,我們沒(méi)有辦法避免Java的Garbage Collection帶來(lái)的開(kāi)銷(xiāo))。

3.2、分配、釋放策略

有了這個(gè)連接池,下面我們就可以提供一套自定義的分配、釋放策略。

當客戶(hù)請求數據庫連接時(shí),首先看連接池中是否有空閑連接,這里的空閑是指,目前沒(méi)有分配出去的連接。如果存在空閑連接則把連接分配給客戶(hù),并作相應處理,具體處理策略,在關(guān)鍵議題中會(huì )詳述,主要的處理策略就是標記該連接為已分配。若連接池中沒(méi)有空閑連接,就在已經(jīng)分配出去的連接中,尋找一個(gè)合適的連接給客戶(hù)(選擇策略會(huì )在關(guān)鍵議題中詳述),此時(shí)該連接在多個(gè)客戶(hù)間復用。

當客戶(hù)釋放數據庫連接時(shí),可以根據該連接是否被復用,進(jìn)行不同的處理。如果連接沒(méi)有使用者,就放入到連接池中,而不是被關(guān)閉。

可以看出正是這套策略保證了數據庫連接的有效復用。

3.3、配置策略

數據庫連接池中到底要放置多少個(gè)連接,連接耗盡后該如何處理呢?這時(shí)一個(gè)配置策略。一般的配置策略是,開(kāi)始時(shí),根據具體的應用需求,給出一個(gè)初始的連接池中連接的數目以及一個(gè)連接池可以擴張到的最大連接數目。本方案就是按照這種策略實(shí)現的。

關(guān)鍵議題

本節將對上述解決方案中的關(guān)鍵細節進(jìn)行詳述,正是這些關(guān)鍵的策略保證了數據庫連接復用的高效和安全。

4.1、引用記數

3.2節中的分配、釋放策略對于有效復用連接非常重要,我們采用的方法也是采用了一個(gè)很有名的設計模式:Reference Counting(引用記數)。該模式在復用資源方面用的非常廣泛,我們把該方法運用到對于連接的分配釋放上。每一個(gè)數據庫連接,保留一個(gè)引用記數,用來(lái)記錄該連接的使用者的個(gè)數。具體的實(shí)現上,我們采用了兩極連接池,空閑池和使用池??臻e池中存放目前還沒(méi)有分配出去被使用的連接,一旦一個(gè)連接被分配出去,那么就會(huì )放入到使用池中,并且增加引用記數。

這樣做有一個(gè)很大的好處,使得我們可以高效的使用連接,因為一旦空閑池中的連接被全部分配出去,我們就可以根據相應的策略從使用池中挑選出一個(gè)已經(jīng)正在使用的連接用來(lái)復用,而不是隨意拿出一個(gè)連接去復用。策略可以根據需要去選擇,我們采用的策略比較簡(jiǎn)單:復用引用記數最小的連接。Java的面向對象特性,使得我們可以靈活的選擇不同的策略(提供一個(gè)不同策略共用的抽象接口,各個(gè)具體的策略都實(shí)現這個(gè)接口,這樣對于策略的處理邏輯就和策略的實(shí)現邏輯分離)。

4.2、事務(wù)處理

前面談到的都是關(guān)于使用數據庫連接進(jìn)行普通的數據庫訪(fǎng)問(wèn)。對于事務(wù)處理,情況就變得比較復雜。因為事務(wù)本身要求原子性的保證,此時(shí)就要求對于數據庫的操作符合"All-All-Nothing"原則,即要么全部完成,要么什么都不做。如果簡(jiǎn)單的采用上述的連接復用的策略,就會(huì )發(fā)生問(wèn)題,因為沒(méi)有辦法控制屬于同一個(gè)事務(wù)的多個(gè)數據庫操作方法的動(dòng)作,可能這些數據庫操作是在多個(gè)連接上進(jìn)行的,并且這些連接可能被其他非事務(wù)方法復用。

Connection本身具有提供了對于事務(wù)的支持,可以通過(guò)設置Connection的AutoCommit屬性為false,顯式的調用commit或者rollback方法來(lái)實(shí)現。但是要安全、高效的進(jìn)行Connection進(jìn)行復用,就必須提供相應的事務(wù)支持機制。我們采用的方法是:采用顯式的事務(wù)支撐方法,每一個(gè)事務(wù)獨占一個(gè)連接。這種方法可以大大降低對于事務(wù)處理的復雜性(如果事務(wù)不獨占一條連接,那么要保證事務(wù)的原子性并且又不妨礙復用該連接的其他和該事務(wù)無(wú)關(guān)的操作,基本上不可能,除非Connection類(lèi)是你開(kāi)發(fā)的),并且又不會(huì )妨礙連接的復用,因為隸屬于該事務(wù)的所有數據庫操作都是通過(guò)這一個(gè)連接完成的,并且事務(wù)方法又復用了其他一些數據庫方法。

在我們的連接管理服務(wù)提供了顯式的事務(wù)開(kāi)始、結束(commit或者rollback)聲明,以及一個(gè)事務(wù)注冊表,用于登記事務(wù)發(fā)起者和事務(wù)使用的連接的對應關(guān)系,通過(guò)該表,使用事務(wù)的部分和我們的連接管理部分就隔離開(kāi),因為該表是在運行時(shí)根據實(shí)際的調用情況,動(dòng)態(tài)生成的。事務(wù)使用的連接在該事務(wù)運行中不能被復用。

當使用者需要使用事務(wù)方法時(shí),首先調用連接管理服務(wù)提供的beginTrans方法,該方法主要處理流程如下(偽碼描述):

           public void beginTrans( ) {
                    …
                conn = getIdleConnectionFromPoll( );
                userId = getUserId( );
                registerTrans(userId, conn);
                    …



 

 

在我們的實(shí)現中,用戶(hù)標識是通過(guò)使用者所在的線(xiàn)程來(lái)標識的。后面的所有對于數據庫的訪(fǎng)問(wèn)都是通過(guò)查找該注冊表,使用已經(jīng)分配的連接來(lái)完成的。當事務(wù)結束時(shí),從注冊表中刪除相應表項。

對于嵌套的事務(wù)如何處理呢?我們采用的方法仍為引用記數,不過(guò)這里的引用記數是指的"嵌套層次",具體的細節,不再贅述。

4.3、封裝

從上面的論述可以看出,普通的數據庫方法和事務(wù)方法對于連接的使用(分配、釋放)是不同的,為了便于使用,對外提供一致的操作接口,我們對連接進(jìn)行了封裝:即普通連接和事務(wù)連接。在此,我們利用了Java中的強大的面向對象特性:多態(tài)。普通連接和事務(wù)連接均實(shí)現了一個(gè)DbConnection接口,對于接口中定義的方法,分別根據自己的特點(diǎn)作了不同的實(shí)現,這樣在對于連接的處理上就非常的一致了。

4.4、并發(fā)問(wèn)題

為了是我們的連接管理服務(wù)有更大的通用性,就必須要考慮到多線(xiàn)程環(huán)境,即并發(fā)問(wèn)題。在一個(gè)多線(xiàn)程的環(huán)境下,我們必須要保證連接管理自身數據的一致性和連接內部數據是一致性,還好Java提供對這方面的很好的支持(synchronized關(guān)鍵字),這樣我們就很容易使連接管理成為線(xiàn)程安全的。

5、結論

本文給出了一個(gè)基本的連接管理框架,在其中使用了一些廣泛使用的設計模式(資源池,引用記數等),使得高效、安全的復用數據庫連接成為可能。當然,還有一些問(wèn)題沒(méi)有考慮到,比如:沒(méi)有實(shí)現對不同種類(lèi)的數據庫的聯(lián)合管理;沒(méi)有提供定時(shí)檢測機制,查詢(xún)連接的狀態(tài)等。另外在連接管理的使用包裝上比起一些商用的系統還顯粗糙,但是底層的基理是一致的,所以通過(guò)本文相信對于這些商用的產(chǎn)品中的相關(guān)功能會(huì )有更好的理解。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
數據庫連接池的工作原理
實(shí)現高效的數據庫連接池(附帶完整代碼C#和Java實(shí)現),數據庫相關(guān)文章,Access,數...
數據庫讀寫(xiě)分離
spring,mybatis事務(wù)管理配置與@Transactional注解使用[轉]
Spring事務(wù)之七(事務(wù)自動(dòng)提交)
JTA
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久