BSS-QC-數(shù)據(jù)庫連接和事務(wù)管理專題_第1頁
BSS-QC-數(shù)據(jù)庫連接和事務(wù)管理專題_第2頁
BSS-QC-數(shù)據(jù)庫連接和事務(wù)管理專題_第3頁
BSS-QC-數(shù)據(jù)庫連接和事務(wù)管理專題_第4頁
BSS-QC-數(shù)據(jù)庫連接和事務(wù)管理專題_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、BSS系統(tǒng)中數(shù)據(jù)庫連接的安全使用和事務(wù)問題匯總V1.0.1修改日期原因修改人2007-099-30根據(jù)zhaoxxin的意見見,修改了HHibernnate的ssessioon連接管理理劉世偉2007-111-8根據(jù)調(diào)優(yōu)組當(dāng)前前的工作,補(bǔ)補(bǔ)充了一些內(nèi)內(nèi)容劉世偉幾個名詞解釋:數(shù)據(jù)庫連接池:眾所周知,建建立數(shù)據(jù)庫連接是是一個昂貴的的操作,每次次都得花費(fèi)約約0.05ss1s的時時間,消耗一定的內(nèi)存資源(OOraclee 9i的一一個空閑連接接約需255MB內(nèi)存,非非空閑連接約約需幾十MB左右右內(nèi)存),而且一旦旦到達(dá)臨界點(diǎn)點(diǎn),系統(tǒng)會陷陷入資源管理理的惡性循環(huán)環(huán):越來越慢。數(shù)據(jù)庫連接接池的基本思思想就是

2、為數(shù)數(shù)據(jù)庫連接建建立一個“緩緩沖池”。預(yù)預(yù)先在緩沖池池中放入一定定數(shù)量的連接接備用,減少使使用時才創(chuàng)建、銷毀的消耗。當(dāng)需要建立立數(shù)據(jù)庫連接接時,只需從從“緩沖池”中中取出一個,使使用完畢之后后再放回去。使使用連接池后后,數(shù)據(jù)庫服服務(wù)器減少了了它并不擅長長的連接管理理工作,通過過池連接的快速復(fù)用,可可以為客戶端端提供更大的的并發(fā)量,內(nèi)內(nèi)存消耗也在在可控范圍內(nèi)內(nèi)波動。我們們可以通過設(shè)設(shè)定連接池最最大連接數(shù)來來防止系統(tǒng)無無盡的與數(shù)據(jù)據(jù)庫連接,控控制數(shù)據(jù)庫的的壓力。我們也可以通過連連接池的管理理機(jī)制監(jiān)控數(shù)據(jù)庫連接的的數(shù)量使用用情況,為系系統(tǒng)開發(fā)測測試及性能調(diào)調(diào)優(yōu)提供依據(jù)據(jù)。真實連接:客戶戶端程序直接和

3、數(shù)據(jù)庫建立立的Connnectioon,使用完畢需需要及時、安全的關(guān)閉閉,否則會導(dǎo)導(dǎo)致數(shù)據(jù)庫內(nèi)內(nèi)存資源泄漏漏、服務(wù)器宕機(jī)代理連接:客戶戶端程序從連接池池獲取的Coonnecttion,它實際上是封裝了真實實連接,提供供和真實連接接相同的功能能,使用完畢畢也需要及時、安全的關(guān)閉閉,否則連接接池中的連接接得不到釋放放,會導(dǎo)致連連接池中可用用的空閑連接接越來越少。當(dāng)然,由于于存在連接池池的控制,數(shù)數(shù)據(jù)庫不會因因此而宕機(jī)。一、BSS數(shù)據(jù)據(jù)庫連接管理理現(xiàn)狀:BSS系統(tǒng)中對對數(shù)據(jù)庫連接的的管理,是統(tǒng)統(tǒng)一通過數(shù)據(jù)據(jù)源(DattaSourrce)管理理的,存在連接池和和單連接兩種種方式的數(shù)據(jù)源源(詳情參考考m

4、odellxxx.jjar中的xxxxDattabasee.xml文文件)連接池數(shù)據(jù)源,命名方式為為“xxxDaataSouurce”,BSS采用了apachhe的開源池池mmons.ddbcp.BBasicDDataSoource,應(yīng)用程序獲取取的是apaache連接接池的代理連接(cconnecctionPProxy),非真實連接。單連接數(shù)據(jù)源,命名方式為為“xxxDaataSouurceNooPool”,BSS采用用了Spriing框架的的org.sspringgframeework.jdbc.datassourcee.DrivverMannagerDDataSoource,程程序獲取的

5、是是真實的數(shù)據(jù)據(jù)庫連接。二、BSS系統(tǒng)統(tǒng)中對數(shù)據(jù)源源的使用Hibernaate的SeessionnFactoory,使用的是連連接池數(shù)據(jù)源源,在配置文文件中一般命命名為“xxxSesssionFFactorry”,而且Hibeernatee本身包含一一個簡單的連連接池hibbernatte.connnectiion,但性能和功能不如aapachee的。Spring的的JdbcTTemplaate,根據(jù)其使用用數(shù)據(jù)源是否否為連接池,命命名方式也不不同,配置文文件中對使用用連接池數(shù)據(jù)據(jù)源的命名為為“xxxJDDBC”,使用單連連接數(shù)據(jù)源的的命名為“xxxJDDBCNoPPool”三、應(yīng)用程序中中對

6、連接的使使用BSS程序中使使用Hibeernatee的sesssion和JJdbcTeemplatte提供的通通用方法一般般是夠用的,但但某些場景下下如執(zhí)行orracle特特性的SQLL語句或存儲儲過程,需要要獲取真實數(shù)據(jù)庫連連接,現(xiàn)在主主要使用以下下幾種方式:Hibernaate中,通通過getSSessioon().cconnecction(),此時獲取的是是連接是根據(jù)據(jù)其數(shù)據(jù)源決決定的,如果果通過連接池池中獲取,則則是代理連接接,否則是真真實數(shù)據(jù)庫連連接,但注意,無論如如何都不能用connn.cloose()語語句顯示關(guān)閉閉的;這時候的cconn其實實是被sesssion管管理了,Hii

7、bernaate會在SSessioon的事務(wù)提提交或回滾的的時候,自動動把連接放回池池中,如果我我們主動關(guān)了了,會拋異常常。JdbcTemmplatee中,通過jjdbc.ggetDattaSourrce().getCoonnecttion(),此時獲取的連接是是根據(jù)其數(shù)據(jù)據(jù)源決定的,如如果jdbcc.getDDataSoource()返回的是是連接池數(shù)據(jù)據(jù)源,則連接接是連接池的的連接代理(重重載了真實連連接的cloose方法),需要從代理連接中再次獲取真實連接,見下面的a段落;如果返回的是單連接的數(shù)據(jù)源,則返回的是真實連接。這2種連接都需要顯式的close關(guān)閉,前者表示把連接還回連接池繼續(xù)使

8、用,后者表示真正關(guān)閉連接,釋放數(shù)據(jù)庫內(nèi)存。對JdbcTeemplatte中返回代代理連接的情情況,由于是是連接代理,對Oracle的Blob和Clob大數(shù)據(jù)對象,在CLOB.createTemporary(conn, true, CLOB.DURATION_SESSION)的時候,會拋ClassCastException,此時需要獲取真實的物理連接,方法如下:設(shè)置DataSSourcee中連接池的的accesssToUnnderlyyingCoonnecttionAlllowedd屬性的值為ttrue,表表示允許從連接代代理中獲取物物理連接;對apachee的BasiicDataaSourcc

9、e,可通過mmons.dbcp.DeleggatinggConneectionn的getDeelegatte()方法法獲取真實連連接。注意,通過連接接池代理連接接而獲取的真真實連接一定定不能直接關(guān)關(guān)閉,否則連連接池就沒有有意義了,最好把這種種情況下的獲獲取物理連接接創(chuàng)建Cllob用方法法屏蔽掉,防止止被誤關(guān)閉。代碼掃描后發(fā)現(xiàn)現(xiàn)系統(tǒng)中普遍遍存在的問題題:1、對打開的數(shù)數(shù)據(jù)庫資源cconn、pps、rs,主主動寫了cllose語句句,但是沒有有寫在finnally語語句塊里面,一一旦發(fā)生異常常,那么cllose語句句就會被旁路路,導(dǎo)致資源源得不到釋放放。2、沒有主動寫寫closee語句,當(dāng)然然這個

10、是存在在一些爭議的的,請看以下下解釋: a、如如果不使用連連接池機(jī)制,關(guān)閉coonnecttion,會自動關(guān)閉閉resulltset和和stateement的的,程序中可可以不顯示關(guān)關(guān)閉; b、如如果使用連接接池,所謂謂的關(guān)閉coonnecttion,其實是將連連接返回給了了連接池,連連接對象依然然存在,實實際上不是物物理關(guān)閉,因因此,必須顯顯示的關(guān)閉rresulttset和sstatemment,否否則連接池中中連接上的rrs和ps會會越來越多。3、單獨(dú)寫了cclose的的語句塊,到到?jīng)]什么問題題,看著不舒舒服罷了。附件是代碼中問問題的位置,請請詳看。建議:我們系統(tǒng)有使用用連接池和單單獨(dú)創(chuàng)建

11、連接接的,所以保保險起見,rresulttset和sstatmeent(PrrepareedStattementt、CalllableSStatemment)一一定在finnally語語句里面主動動保持先后次次序closse掉,在此此貼一下示例例程序。Connecttion ccon = null;PrepaaredSttatemeent pss = nuull;ReesultSSet rss = nuull;try .catch (SSQLExcceptioon ex).finallyy tryy if(rss!=nulll) rrs.cloose(); ccatch (SQLEExcept

12、tion eex) /錯誤處理 trry if(pps!=nuull) ps.cllose(); catchh (SQLLExcepption ex) /錯誤處理理 ttry if(ccon!=nnull)/注意:Hiberrnate中中得到的coonn不能關(guān)關(guān)閉。 conn.closse(); caatch (SQLExxceptiion exx) /錯錯誤處理 數(shù)據(jù)庫事務(wù)管理理現(xiàn)狀:BSS中采用了了Sprinng的聲明式式事務(wù)管理,在配置文件中通過對象或方法的名稱通配事務(wù)的加載與否。由于存在以上的的數(shù)據(jù)庫連接接管理方式,所所以對數(shù)據(jù)庫庫的事務(wù)管理理也是存在多多種方式:Hibernaate的

13、seessionnJdbcTemmplatee通過sessiion或jddbcTemmplatee獲取的Connnectiion,一般般直接執(zhí)行ssql語句和和存儲過程存在的問題:1、事務(wù)回滾規(guī)規(guī)則只有DAAOExceeptionn(部分),缺缺BssExxceptiion 現(xiàn)在BMOO中規(guī)范拋出出BssExxceptiion,一旦旦BMO方法法中出現(xiàn)異常常,現(xiàn)在的配配置是事務(wù)不不回滾的,導(dǎo)導(dǎo)致前后數(shù)據(jù)據(jù)不完整。 建議,sspringg事務(wù)配置里里面加入強(qiáng)制制回滾模式匹匹配: -bbss.coommon.BssExxceptiion,如下下: PROPPAGATIION_REEQUIREED,

14、-mmon.DDAOExcceptioon,-mmon.BBssExcceptioon EJJB事務(wù)回滾滾規(guī)則: 1、如如果beann拋出RunntimeEExcepttion,容容器會自動回回滾事務(wù),并并且在外面包包裝一個ReemoteEExcepttion拋出出。 2、如果bbean拋出出其他的異常常,容器不會會做任何處理理,除非強(qiáng)制制定義。2、事務(wù)攔截截粒度比較粗粗,定義在類類級別而不是是方法級別 事務(wù)攔攔截器的配置置在beann的名稱上,該該bean下下所有的方法法都按照同一一種事務(wù)模式式 象rreadonnly的事務(wù)務(wù)隔離模式,對對只查詢不修修改的方法,性性能提高比較較大,但需要要更

15、改攔截器器,定義在方方法級別。 此條只涉涉及性能,影影響不是很大大,可酌情。3、EJB和spring的事務(wù)傳遞問題 如果BMO中spring不加載事務(wù),被EJB包裝后,發(fā)現(xiàn)EJB的事務(wù)不能傳遞給spring,EJB事務(wù)回滾了,但是spring管理bean的事務(wù)仍舊提交了,原因待詳查,初步分析是ejb容器和spring容器事務(wù)不能透傳,按照EJB規(guī)范,CMT(容器管理的事務(wù))內(nèi)部是不能有嵌套事務(wù)的。當(dāng)前為規(guī)避此種情況,建議所有的BMO,如果需要事務(wù)的,名稱一律按照規(guī)范以“Manager”“DAO”結(jié)尾。調(diào)優(yōu)組正在組織力量集中解決這個問題,初步思路是啟用EJB BMT(Bean 管理事務(wù)),使用w

16、ebsphere的事務(wù)管理和連接池存儲過程和Jaava事務(wù)的的嵌套問題:在一個bmo中中同時調(diào)用幾幾個dao,dao中分別別用hibeernatee、jdbc和存存儲過程完成成inserrt或updatte操作,事務(wù)是是可以完整的的,不過需要要注意2點(diǎn):一是存儲過程里里面不能有ccommitt和rollbback二是dao調(diào)用用存儲過程后后,dao中也不不要寫commmit和rollbback,只只要closse就可以,由事事務(wù)控制自動動提交,除非非捕捉到bsssexceeptionn,這里要在在sprinng的事務(wù)攔攔截中配一下下bssexxceptiion、daaoExceeptionn,這樣就可可以控制異常常的回滾。遺留問題:采用連接池后,如如果數(shù)據(jù)庫存存儲過程

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論