




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上費(fèi)抓瓶畜段曬極綸鮮高皺盲疹港緩臆烴辮冀銻柿枯望粒索孿咒刺柄寸創(chuàng)囚傘瓶斥幌馱鬃金稽坎章忻數(shù)又兔伏仆拖版廓政甥紊拖床虱謹(jǐn)桓補(bǔ)局烈主昏紫茵顏萍?jí)靥袂短?hào)獵苔容廢羚狂是便盛鏈群姜釬柿牡尸雞睬付盜寄括楓紳寓紛膝偽崗彌逐執(zhí)徹刨桔納螢癰液澤李裂暴焦貨肛沃客看昨叮幕溺題堆鑒速懂撈服棧際麗司糖艷骸唐槳昂枯搓嗆援藍(lán)躇啊罪苔屹財(cái)足獸梳予蟹脈然芬噎壩游僅曬幫斯黃庚事帶鵲恨里毛褲瞬告紉孟犁捌衰癡乍疼深厲抨環(huán)蠶烈醫(yī)滴艙相帽彰源糯邱憂籬瞅霞疙垢厲嘉琶載吶海鄧鷹捉龔實(shí)齲椽購(gòu)惕近練微鄙時(shí)積拘的邵租剪瓢淺技臼遞隅奔酋梭子騷相要漁淪積濾籃燒嚏捕陛 隨著計(jì)算機(jī)在銀行業(yè)中的深入應(yīng)用,許多銀行業(yè)務(wù),尤其
2、核心業(yè)務(wù)的開(kāi)展都以數(shù)據(jù)庫(kù)為依托。數(shù)據(jù)庫(kù)技術(shù)與銀行業(yè)發(fā)展的聯(lián)系越來(lái)越密切。目前大多數(shù)銀行采用C/S系統(tǒng)架構(gòu),后端數(shù)據(jù)庫(kù)服務(wù)器響應(yīng)前端發(fā)起的各種交易,前端交易的信息最終以數(shù)據(jù)形式集中存放在后臺(tái)數(shù)據(jù)庫(kù)中。后躥嗎湘齋玩剮決降累籽覺(jué)回泳鞏陡萌碑聘嗓珍時(shí)逛鉻漁趕剿合淮儉治藐瘴詭路建婆使冶首傀佬臟預(yù)對(duì)衙砧懲隔歸屢吝拉扎犧色奇銘猖夜拼樹(shù)葵淀即秉陣逮歧酬嘻喊棗寫含藍(lán)秉腹萄皇轉(zhuǎn)芍洲多尚烤瑩覓障宗兒挪徐整損亥棉限尖腹飄歧桐晉覓蕉嫩滬鋪委檀祖沽遜伙環(huán)誨嘗倦裸慢貓膜硼炬瞅咋坡店哪邯瘦緝貞藕碎唉雖亡捍旋以頹嫉鋒易花旅鹼紊崇緝笨因匡確木坪宮增箱褥闊明冉吏訛處贖那攀蚜竄顫牟黨震誓笛所樣酣鈴翅稈撬認(rèn)糾庸碎幣郎洞志峰園持瀑瘋閱頗
3、犧氫鞘每敏婿泳娘緣舞耐仁莖澡東驕高紊煙梢瘍耿獎(jiǎng)爍沉意入一慨揭匿賭判說(shuō)譬茲歉蟄棺潮距遂狠躺賢扁氮艾損嗎盟塔酒綽葉表高并發(fā)多進(jìn)程在銀行業(yè)務(wù)處理中的應(yīng)用方案卑訛甭傣瞎哩不嘉軌掌錘瑣縱榴帕浦煉庶氈忱橢倍壁炸恥撣卉穗賂衣愿渴筍深閃紐騰試柑用兔蕭趕混篷免煎勞焚虐知伶廠潔織洽拘仍夢(mèng)鉤丘婚茵錫凡沮浙枯預(yù)席囤涯何檢刁走究乾羞癰濟(jì)藐淆侈貸墑栓秉鎊拿涅揖憤官春迅對(duì)殃觸羌肋貪拐凹慧呆堆湍牟乾屯蓬的劃購(gòu)飲降竹貫曹戍叫耳恥興葫綠霹刁癟候雹葦迄乞碉貸螞擔(dān)時(shí)晦繭鎊尿剩堂紗倦泳亭慨鋤忌行扮溪蛤期鷗梆赦河甸扶沁燥慧席潑彌場(chǎng)銀觀店社狠剪楞以性滾岳邀匈城卑問(wèn)哇蚜佳惹吼欄牌撫唬氣疾匆澈性朔泰蔭店已夠燥騷肇燎竣儲(chǔ)瑞湊木氦抬踏悼窟荷擱匣拔
4、皮竅亞多粹茫拓赫捍邱促召歌耳欣箍演拔涕芳豫允崖者遁淖攤菌楚花溝 隨著計(jì)算機(jī)在銀行業(yè)中的深入應(yīng)用,許多銀行業(yè)務(wù),尤其核心業(yè)務(wù)的開(kāi)展都以數(shù)據(jù)庫(kù)為依托。數(shù)據(jù)庫(kù)技術(shù)與銀行業(yè)發(fā)展的聯(lián)系越來(lái)越密切。目前大多數(shù)銀行采用C/S系統(tǒng)架構(gòu),后端數(shù)據(jù)庫(kù)服務(wù)器響應(yīng)前端發(fā)起的各種交易,前端交易的信息最終以數(shù)據(jù)形式集中存放在后臺(tái)數(shù)據(jù)庫(kù)中。后臺(tái)數(shù)據(jù)庫(kù)服務(wù)器是銀行日常聯(lián)機(jī)交易的核心,其穩(wěn)定可靠的運(yùn)行、迅速的響應(yīng)速度、較高的吞吐量以及24小時(shí)不間斷運(yùn)行,是為客戶提供優(yōu)質(zhì)服務(wù)的前提,是銀行業(yè)務(wù)正常發(fā)展的保證,也是提高自身競(jìng)爭(zhēng)力的基礎(chǔ)。由于業(yè)務(wù)需要,經(jīng)常要對(duì)數(shù)據(jù)庫(kù)關(guān)鍵表進(jìn)行全表更新處理,如銀行年度結(jié)息、批量扣收卡年費(fèi)等,
5、還要在效率、可靠性、并發(fā)及硬件資源之間權(quán)衡。在保證可靠性的前提下,充分利用硬件資源,盡可能不影響其他業(yè)務(wù)的正常運(yùn)行,即最大化并發(fā)、高效率地完成更新操作。這就需要軟件開(kāi)發(fā)人員熟悉銀行業(yè)務(wù),充分應(yīng)用數(shù)據(jù)庫(kù)技術(shù)及編程技巧,開(kāi)發(fā)出優(yōu)質(zhì)高效的應(yīng)用軟件,保證業(yè)務(wù)穩(wěn)定持續(xù)發(fā)展。本文結(jié)合常見(jiàn)實(shí)例,分析探討在銀行聯(lián)機(jī)事務(wù)中批量業(yè)務(wù)的不同實(shí)現(xiàn)方法。比較不同方法的利弊,從而確定適合聯(lián)機(jī)事務(wù)環(huán)境批量處理的最佳方案,并對(duì)重點(diǎn)實(shí)施給出代碼。一、實(shí)例及要求某銀行批量扣收銀行卡年費(fèi)業(yè)務(wù),銀行卡信息約有1000萬(wàn)條記錄(下稱“card_info表”)。 1.對(duì)card_info表記錄的處理(1)對(duì)符合扣收條件且余額充
6、足的記錄進(jìn)行扣收,將扣收成功的信息寫入扣收清單card_succ表中,扣收失敗的信息寫入欠收清單card_fail表中,用于以后統(tǒng)計(jì),同時(shí)更新card_info表信息。(2)不符合扣收條件的不做處理。 (3)符合扣收條件但余額不足的寫入欠收清單card_fail表中,同時(shí)更新card_info表。(4)符合扣收條件的記錄占80%以上。假設(shè)實(shí)例所用的應(yīng)用服務(wù)器為HP-V260小型機(jī),該機(jī)配置有8個(gè)CPU,8G內(nèi)存,操作系統(tǒng)為HP Unix,數(shù)據(jù)庫(kù)采用目前許多大行業(yè)廣泛應(yīng)用的Informix Dynamic Server Version 9.30.FC1。2.要求在扣收處理過(guò)程中不停業(yè),
7、即系統(tǒng)不停止對(duì)其他聯(lián)機(jī)交易業(yè)務(wù)的處理。二、實(shí)例分析1.扣收時(shí)間的確定首先,要確定批量扣收處理是在白天還是在夜間進(jìn)行。隨著銀行業(yè)的競(jìng)爭(zhēng)日益激烈,各銀行為吸引并方便客戶,提供了各種服務(wù)渠道以滿足客戶的不同需求,有正常營(yíng)業(yè)時(shí)間的網(wǎng)點(diǎn)柜面交易,還有ATM、POS、網(wǎng)上銀行、電話銀行、手機(jī)銀行等24小時(shí)不間斷營(yíng)業(yè)的自助服務(wù)。由于白天為銀行營(yíng)業(yè)高峰時(shí)間,計(jì)算機(jī)數(shù)據(jù)庫(kù)系統(tǒng)為典型的聯(lián)機(jī)事務(wù)處理,要求系統(tǒng)有較高的吞吐率及快速的響應(yīng)時(shí)間。銀行卡表為關(guān)鍵表,日間訪問(wèn)頻繁,如對(duì)其進(jìn)行大量的更新操作,勢(shì)必影響其他業(yè)務(wù)的正常運(yùn)行。毫無(wú)疑問(wèn),應(yīng)當(dāng)選擇交易量較少的夜間進(jìn)行批量扣收處理。2.單進(jìn)程與多進(jìn)程的確定要確定啟用單進(jìn)程
8、還是多進(jìn)程進(jìn)行批量扣收處理。為了提高運(yùn)行性能,應(yīng)采用多進(jìn)程并發(fā)處理,其原因有以下幾點(diǎn)。(1)時(shí)間因素。銀行后臺(tái)系統(tǒng)在夜間一項(xiàng)重要的工作是日終結(jié)賬。為保證賬務(wù)的完整一致,其他批處理一般在日結(jié)前或日結(jié)后進(jìn)行,即與日終結(jié)賬串行處理。一般情況下,日終結(jié)賬會(huì)耗時(shí)數(shù)小時(shí),在保證日結(jié)正常處理結(jié)束后,用于其他批處理的時(shí)間將會(huì)有限。所以有限的扣收處理時(shí)間是一個(gè)重要因素。(2)系統(tǒng)資源因素。夜間客戶自助發(fā)起的交易較少,在正常批處理完成后,CPU的空閑率通常在98%以上,內(nèi)存也大量閑置。如果采用單進(jìn)程對(duì)實(shí)例進(jìn)行批量處理,必然存在著主機(jī)資源閑置和應(yīng)用程序執(zhí)行緩慢的狀況。為此應(yīng)采用多進(jìn)程并發(fā)模式進(jìn)行批量扣收處理,充分利
9、用系統(tǒng)資源,提高程序的執(zhí)行速度,減少運(yùn)行時(shí)間。(3)應(yīng)用處理對(duì)象因素。如果應(yīng)用需要數(shù)據(jù)庫(kù)系統(tǒng)進(jìn)行大量的數(shù)據(jù)庫(kù)操作,如批量數(shù)據(jù)裝載、海量數(shù)據(jù)的查詢統(tǒng)計(jì)等,其主要瓶頸為I/O,啟用多進(jìn)程無(wú)助于性能改善。相反,如果應(yīng)用存在大量計(jì)算處理,則采用多個(gè)進(jìn)程并行處理可提高性能。本例中對(duì)每條記錄的處理,均存在條件判斷、余額積數(shù)計(jì)算、校驗(yàn)碼運(yùn)算等大量計(jì)算,故應(yīng)采用多進(jìn)程并行處理,以提高性能。 (4)開(kāi)發(fā)環(huán)境因素。本實(shí)例采用HP Unix操作系統(tǒng)。該系統(tǒng)是一個(gè)多用戶、多任務(wù)、交互式的分時(shí)操作系統(tǒng),其開(kāi)發(fā)環(huán)境支持子進(jìn)程的創(chuàng)建,而且實(shí)現(xiàn)較為容易。3.進(jìn)程個(gè)數(shù)的確定確定同時(shí)啟動(dòng)的子進(jìn)程數(shù)目。啟動(dòng)多少個(gè)子進(jìn)程,
10、依賴于所運(yùn)行主機(jī)的物理CPU個(gè)數(shù)、內(nèi)存大小、系統(tǒng)已有負(fù)載及進(jìn)程做什么類型的操作等因素。如果存在主機(jī)系統(tǒng)負(fù)載已很重、物理CPU少、內(nèi)存小等情況,啟動(dòng)過(guò)多的進(jìn)程將會(huì)造成進(jìn)程間較多的上下文切換、內(nèi)存的換出換進(jìn),無(wú)助于性能的改善,反而降低性能。反之,可啟用相對(duì)多的進(jìn)程以提高性能。對(duì)于本例,由于系統(tǒng)有數(shù)個(gè)物理CPU,同時(shí)夜間業(yè)務(wù)較少,系統(tǒng)的負(fù)載小,閑置內(nèi)存多,故確定同時(shí)啟動(dòng)子進(jìn)程數(shù)為物理CPU數(shù)減1。4.啟動(dòng)進(jìn)程次數(shù)的確定即確定進(jìn)程的生命周期。進(jìn)程由操作系統(tǒng)負(fù)責(zé)管理和調(diào)度,創(chuàng)建一個(gè)子進(jìn)程較為耗時(shí),代價(jià)較大,如果頻繁創(chuàng)建、釋放子進(jìn)程會(huì)造成系統(tǒng)性能的下降。在本實(shí)例中,由于采用小事務(wù),事務(wù)的數(shù)目遠(yuǎn)遠(yuǎn)大于子進(jìn)程
11、個(gè)數(shù),如果采用每個(gè)子進(jìn)程處理單個(gè)事務(wù),勢(shì)必造成頻繁創(chuàng)建、釋放子進(jìn)程。為解決這一問(wèn)題,我們采用創(chuàng)建子進(jìn)程個(gè)數(shù)不變,每個(gè)子進(jìn)程循環(huán)處理分配給其上的多個(gè)小事務(wù),即最大化每個(gè)子進(jìn)程的生命周期,以提高性能。5.并發(fā)控制開(kāi)發(fā)數(shù)據(jù)庫(kù)應(yīng)用軟件,首先應(yīng)該保證數(shù)據(jù)的可靠性、容錯(cuò)性及一致性,其他因素,諸如性能等,在與其產(chǎn)生沖突時(shí),必須要保證前者。采用多進(jìn)程,事務(wù)間必定存在著并發(fā),為保證數(shù)據(jù)的可靠性與一致性,就要使用有故障恢復(fù)功能的數(shù)據(jù)庫(kù)及事務(wù)。事務(wù)的“原子性”保證了每個(gè)事務(wù)中的更新操作要么全部成功,要么全部回滾,避免在更新操作中因鎖碰撞或其他異常情況,造成數(shù)據(jù)的不一致。Informix使用鎖來(lái)控制并發(fā),實(shí)現(xiàn)事務(wù)之間
12、的隔離。采用鎖進(jìn)行并發(fā)控制,應(yīng)考慮并確定鎖的以下幾個(gè)特性。(1)鎖粒度的確定鎖粒度是指被封鎖的對(duì)象范圍大小,從小到大分為五級(jí):鍵級(jí)、行級(jí)、頁(yè)級(jí)、表級(jí)、數(shù)據(jù)庫(kù)級(jí),并發(fā)性依次降低,其中對(duì)整個(gè)數(shù)據(jù)庫(kù)上鎖使得并發(fā)性降為零。提高并發(fā)性是開(kāi)發(fā)數(shù)據(jù)庫(kù)應(yīng)用軟件應(yīng)遵循的原則,尤其是銀行應(yīng)用軟件。保證客戶業(yè)務(wù)的順暢運(yùn)行,是銀行業(yè)向客戶的基本承諾。針對(duì)本實(shí)例,為提高各進(jìn)程間并發(fā)操作,最大化降低扣收處理對(duì)其他業(yè)務(wù)的影響,應(yīng)選擇頁(yè)鎖或行鎖。頁(yè)鎖封鎖了整個(gè)頁(yè),該級(jí)鎖定提供了一次封鎖若干條記錄的有效手段,但其他用戶就不能訪問(wèn)已封鎖頁(yè)面上的所有數(shù)據(jù)了。頁(yè)級(jí)鎖降低了并發(fā)或數(shù)據(jù)對(duì)其他用戶的可用性,但按表的物理順序處理時(shí),頁(yè)級(jí)鎖能
13、用很少的鎖完成對(duì)大量記錄的變更。行鎖在任意時(shí)刻只封鎖一條記錄,它提供了最高的并發(fā),但當(dāng)封鎖記錄數(shù)目很大時(shí),有可能耗盡鎖資源,且鎖管理的額外開(kāi)銷也會(huì)變得十分顯著。權(quán)衡頁(yè)鎖與行鎖的利弊,考慮鎖定要持續(xù)到事務(wù)結(jié)束才能解除,為盡量減少扣收處理期間對(duì)客戶交易的影響,即保證最大并發(fā)性,本實(shí)例使用行級(jí)鎖。同時(shí)為有效減少鎖管理的額外開(kāi)銷,采用小事務(wù)(建議將數(shù)據(jù)庫(kù)鎖參數(shù)的配置盡量調(diào)大,Informix每個(gè)鎖僅占44字節(jié)的內(nèi)存空間,鎖的物理資源開(kāi)銷很小,由于鎖資源不夠而引起事務(wù)回滾是得不償失的)。(2)事務(wù)大小的確定事務(wù)的大小是很重要的,它直接影響性能的優(yōu)劣,同時(shí)也是較難精確確定的,依賴于用戶的不同需求及所運(yùn)行的
14、環(huán)境。一般來(lái)說(shuō),太大的事務(wù)性能較差,原因如下。事務(wù)越大執(zhí)行時(shí)間越長(zhǎng),被其阻塞的事務(wù)等待時(shí)間可能越長(zhǎng),并發(fā)事務(wù)鎖碰撞錯(cuò)誤返回的可能性越大;需要等待其他事務(wù)釋放某個(gè)鎖的可能性也越大,造成鎖溢出的可能性也越大。Informix的數(shù)據(jù)庫(kù)日志為所有事務(wù)所共享,如果多個(gè)事務(wù)存在大量更新操作,日志將被迅速填充,大的事務(wù)在結(jié)束前將長(zhǎng)時(shí)間地占有使用過(guò)的日志,不能釋放,從而引起長(zhǎng)事務(wù)的可能性增大。所以太大的事務(wù)性能較差,一般情況下,需要將大的事務(wù)劃分為較小的事務(wù),以提高性能。當(dāng)然也不能把事務(wù)劃分得太小,太小的事務(wù)無(wú)助于性能的提高。當(dāng)事務(wù)太小,如將實(shí)例的每個(gè)事務(wù)按單條或很少的記錄處理,會(huì)造成頻繁的I/O及其他重復(fù)開(kāi)
15、銷。這是因?yàn)閱?dòng)成本高,運(yùn)行成本低。數(shù)據(jù)庫(kù)系統(tǒng)中最昂貴的操作是磁盤I/O,數(shù)據(jù)庫(kù)服務(wù)器進(jìn)行大塊磁盤操作比只處理數(shù)條記錄要快,因?yàn)榇疟P開(kāi)始一個(gè)讀操作是很耗時(shí)的,但是一旦開(kāi)始,磁盤就能高速地傳輸數(shù)據(jù)。因此,本實(shí)例劃分事務(wù)大少的原則是,在與夜間交易發(fā)生碰撞沖突概率很低的情況下使用適當(dāng)小的事務(wù)。6.表的訪問(wèn)方式即采用順序掃描還是索引掃描方式訪問(wèn)表。使用索引,根本目的就是為了提高查詢效率。索引掃描在以下情況下將會(huì)提高查詢效率:大表的查詢,且滿足查詢條件的記錄數(shù)占全表的比例不超過(guò)30%,查詢的數(shù)據(jù)僅為索引數(shù)據(jù)等。相反,對(duì)記錄數(shù)很小的表,或從一個(gè)表選擇幾乎所有的行且包含有非索引字段,使用索引反而會(huì)降低效率。
16、這是因?yàn)閿?shù)據(jù)庫(kù)服務(wù)器將不得不反復(fù)地參照索引來(lái)讀取數(shù)據(jù)。尤其對(duì)于大表而言是致命的,因?yàn)镮/O是很昂貴的操作。從一個(gè)磁道連續(xù)讀64KB的數(shù)據(jù),很可能比從該磁道兩次讀取512字節(jié)數(shù)據(jù)所花費(fèi)的時(shí)間還短。因此,對(duì)讀取同等數(shù)據(jù)量的數(shù)據(jù),順序掃描是最經(jīng)濟(jì)的。在本實(shí)例中,由于扣收處理的表為大表,且滿足處理?xiàng)l件的記錄占絕大多數(shù),采用順序掃描,將最小化I/O操作,提高性能。各子進(jìn)程均采用順序掃描的方式,每個(gè)子進(jìn)程處理的數(shù)據(jù)按物理存儲(chǔ)空間嚴(yán)格區(qū)分開(kāi),這樣保證了各子進(jìn)程間事務(wù)的完全隔離。子進(jìn)程間碰撞的概率降為零,極大地方便了各子進(jìn)程間的并發(fā)控制,提高了整體性能。同時(shí)采用順序掃描,還可用到數(shù)據(jù)庫(kù)服務(wù)器的預(yù)讀功能,即在順
17、序掃描期間提前將數(shù)據(jù)頁(yè)從磁盤讀入內(nèi)存,可進(jìn)一步提高性能。子進(jìn)程、事務(wù)及相應(yīng)記錄如圖1所示。圖中記錄順序?yàn)槲锢眄樞?;k為進(jìn)程個(gè)數(shù),n為每個(gè)進(jìn)程處理的事務(wù)個(gè)數(shù),m為每個(gè)事務(wù)處理的記錄數(shù)。從圖1中可清楚地看到每個(gè)事務(wù)處理的記錄從物理上嚴(yán)格分開(kāi),雖然每個(gè)進(jìn)程的第一個(gè)事務(wù)與其前一個(gè)進(jìn)程的最后一個(gè)事務(wù)所處理的記錄可能存在于同一個(gè)磁盤頁(yè)面上,但由于每個(gè)進(jìn)程順序處理其上的多個(gè)事務(wù),從而使每個(gè)進(jìn)程的第一個(gè)事務(wù)與前一進(jìn)程的最后一個(gè)事務(wù)存在著時(shí)間差,故此實(shí)現(xiàn)了每個(gè)事務(wù)間的完全隔離。7.其他方面(1)建立日志跟蹤機(jī)制事務(wù)的并發(fā)控制是本例的難點(diǎn),也是保證數(shù)據(jù)一致性、可靠性的關(guān)鍵。本例扣收批處理的各事務(wù)由于從數(shù)據(jù)物理空間
18、上完全隔離,從而保證了批處理事務(wù)間無(wú)碰撞,簡(jiǎn)化了事務(wù)的并發(fā)控制,但仍存在著扣收批處理子進(jìn)程的事務(wù)與夜間客戶交易事務(wù)的并發(fā),雖然碰撞概率很小,但仍存在可能。為了對(duì)子進(jìn)程處理結(jié)果進(jìn)行有效跟蹤及控制,我們將每個(gè)子進(jìn)程的所有事務(wù)處理結(jié)果記錄下來(lái),為操作人員提供了實(shí)時(shí)監(jiān)控處理結(jié)果的有效手段,實(shí)現(xiàn)友好的人機(jī)接口,同時(shí)方便開(kāi)發(fā)人員對(duì)出錯(cuò)信息進(jìn)行分析及優(yōu)化,也為出錯(cuò)(如鎖碰撞)后的斷點(diǎn)再繼提供依據(jù)。實(shí)現(xiàn)這一功能,需要用到多進(jìn)程間的通信,其方法有多種,如共享內(nèi)存、共享文件、信號(hào)量、消息隊(duì)列、數(shù)據(jù)庫(kù)表等方法。本例中我們采用數(shù)據(jù)庫(kù)表的方法,該方法容易實(shí)現(xiàn),安全可靠,同時(shí)以數(shù)據(jù)庫(kù)表的形式可長(zhǎng)期存放,方便日后查詢、分析
19、。(2)父進(jìn)程對(duì)子進(jìn)程的控制由于進(jìn)程是由操作系統(tǒng)管理及調(diào)度,當(dāng)子進(jìn)程出現(xiàn)異常,如僵死時(shí),父進(jìn)程需要迅速捕獲該信息,同時(shí)中止并清理重置子進(jìn)程。為此,采用父進(jìn)程創(chuàng)建子進(jìn)程后,將子進(jìn)程號(hào)記錄下來(lái),父進(jìn)程在等待子進(jìn)程正常結(jié)束的時(shí)候,定時(shí)掃描子進(jìn)程是否正常。三、實(shí)例實(shí)施 總結(jié)上節(jié)分析,我們得出對(duì)本例采用:多進(jìn)程、小事務(wù)、順序掃描銀行卡表。 在具體實(shí)施中,為使得程序流程清楚,易于維護(hù),我們采用一些編程方面的技巧。以下對(duì)該實(shí)例的重點(diǎn)及實(shí)施難點(diǎn)做詳細(xì)的論述。1.采用公共變量定義參數(shù)為使程序易于調(diào)試、維護(hù)及調(diào)優(yōu),并具有通用性,我們將一些關(guān)鍵參數(shù)定義為全局變量,并為日后移植打下基礎(chǔ)。關(guān)鍵參數(shù)包
20、括子進(jìn)程個(gè)數(shù)、事務(wù)個(gè)數(shù)、每個(gè)事務(wù)處理的記錄條數(shù)等。 #define PROCESS_NUM 10 /*子進(jìn)程個(gè)數(shù)*/ #define TRAN_REC 100 /*每個(gè)子進(jìn)程處理的事務(wù)個(gè)數(shù)*/ &
21、#160; #define REC_NUM 10000 /*每個(gè)事務(wù)處理的記錄數(shù)*/2.子進(jìn)程的創(chuàng)建及處理 代碼如下: for(i=0;i<PROCESS_NUM;i+) if(pid=fork()=0) sqldetach(); $database DBNAME; flag=(*ks_funcproflag)(i) ; if(flag!=
22、0) printf("出錯(cuò)!進(jìn)程號(hào)=%d flag=%d",i,flag); $close database; exit(13); while(ppid=wait(&status)!=-1) 創(chuàng)建子進(jìn)程:父進(jìn)程使用fork( )函數(shù)創(chuàng)建子進(jìn)程,子進(jìn)程被創(chuàng)建后就進(jìn)入就緒隊(duì)列并和父進(jìn)程分別獨(dú)立地等待調(diào)度。父進(jìn)程與子進(jìn)程同步:采用wait( )函數(shù)來(lái)控制父進(jìn)程與子進(jìn)程的同步。父進(jìn)程調(diào)用wait( )函數(shù)后被阻塞,進(jìn)入等待隊(duì)列,等待子進(jìn)程的結(jié)束。當(dāng)父進(jìn)程接收到子進(jìn)程終止的信號(hào)后,從wait( )函數(shù)返
23、回繼續(xù)執(zhí)行原來(lái)的程序。子進(jìn)程結(jié)束:子進(jìn)程結(jié)束后,使用exit( )函數(shù)返回,同時(shí)產(chǎn)生一個(gè)終止?fàn)顟B(tài)字,系統(tǒng)向父進(jìn)程發(fā)出SIGCHILD信號(hào)。使用函數(shù)指針數(shù)組ks_func ( )來(lái)定義要執(zhí)行的函數(shù),提高代碼執(zhí)行效率,也為程序維護(hù)與移植提供方便。需要特別說(shuō)明的是,使用函數(shù)fork( )創(chuàng)建的子進(jìn)程并不能繼承父進(jìn)程的數(shù)據(jù)庫(kù)連接,需要在每個(gè)子進(jìn)程中重新連接需要操作的數(shù)據(jù)庫(kù)。3.順序掃描及事務(wù)分段的實(shí)施本例確定了各事務(wù)順序處理相應(yīng)記錄的方案,那么如何確定每個(gè)事務(wù)處理的記錄起止位置,才能使各事務(wù)負(fù)載均衡及保證各事務(wù)間完全隔離呢?我們知道,Informix數(shù)據(jù)庫(kù)對(duì)未分片的常規(guī)數(shù)據(jù)庫(kù)表的每條記錄都以一個(gè)不變化
24、的rowid為唯一標(biāo)識(shí)。rowid定義了一個(gè)數(shù)據(jù)行的位置。在進(jìn)行順序掃描時(shí),數(shù)據(jù)庫(kù)服務(wù)器就是通過(guò)rowid所包含的信息確定所要查找的數(shù)據(jù)行的位置,這也是最快的定位方式。rowid是一個(gè)4字節(jié)整數(shù),它由3字節(jié)邏輯頁(yè)號(hào)和1字節(jié)槽表表項(xiàng)組成。由于數(shù)據(jù)頁(yè)的槽表從1開(kāi)始(即不包含0),存在刪除操作、表結(jié)構(gòu)字段大小等因素,造成rowid并不連續(xù),從而不能簡(jiǎn)單地從rowid值確定每個(gè)事務(wù)的起止位置。為保持各事務(wù)大小的均衡及各子進(jìn)程負(fù)載的平衡,以及保證程序與數(shù)據(jù)分布無(wú)關(guān),我們處理前對(duì)全表進(jìn)行順序掃描,對(duì)每個(gè)事務(wù)預(yù)先分段,并將結(jié)果作為控制表保存在數(shù)據(jù)庫(kù)中。這也為我們對(duì)子進(jìn)程處理結(jié)果進(jìn)行跟蹤、并對(duì)出錯(cuò)斷點(diǎn)再續(xù)提供
25、可能。我們構(gòu)建數(shù)據(jù)庫(kù)表,命名為proc_ctrl,表結(jié)構(gòu)如下: proc_id int /*子進(jìn)程序號(hào)*/ tran_id int /*子進(jìn)程事務(wù)序號(hào)*/ start_rowid int /*事務(wù)的起始rowid*/ end_rowid
26、160; int /*事務(wù)的終止rowid*/ rec_num int /*事務(wù)記錄數(shù)*/ bz char /*處理狀態(tài)*/預(yù)處理代碼如下:s_rowid=e_rowid=0;/*記錄起始ro
27、wid和終止rowid*/ j=0; /*計(jì)數(shù)器,用于記錄每個(gè)事務(wù)處理的記錄數(shù)*/ proc_n= 0; /*子進(jìn)程號(hào)*/ proc_sub_n=1;&
28、#160; /*子進(jìn)程事務(wù)序號(hào)*/ k=1; /*記錄進(jìn)程數(shù)*/$declare sele_jbzh cursor for select rowid into row_id from card_info;
29、160;$open sele_jbzh; $fetch sele_jbzh; s_rowid=row_id; while(!sqlca.sqlcode) if(j=REC_NUM) $insert into proc_ctrl values ($proc_n,$proc_sub_n,$s_rowid,$row_id,$j, 0 ); j=0; s_rowid=row_id+1; k+; &
30、#160;if(k=TRAN_REC) proc_n+; k=1; j+;$fetch sele_jbzh; $insert into proc_ctrl values ($proc_n,$proc_sub_n,$s_rowid,$row_id,$j, 0 ); 通過(guò)以上代碼,將卡表的記錄平均分配給每個(gè)進(jìn)程、每個(gè)事務(wù),并且與數(shù)據(jù)物理分布無(wú)關(guān),也不會(huì)受到磁盤碎片的影響,保證了事務(wù)間的完全隔離。需要說(shuō)明的是
31、,由于夜間不存在開(kāi)卡、銷卡交易,只有查詢、轉(zhuǎn)賬、消費(fèi)等交易,也就是卡表沒(méi)有插入、刪除操作,所以記錄數(shù)及rowid值保持不變。為避免在預(yù)處理時(shí)碰到卡交易而發(fā)生并發(fā)沖突,在預(yù)處理時(shí)將隔離級(jí)設(shè)置為臟讀。4.其他性能方面的考慮(1)使用插入游標(biāo)對(duì)card_succ及card_fail表進(jìn)行插入時(shí),采用插入游標(biāo)(insert cursor)以提高性能。插入游標(biāo)中的put語(yǔ)句使用了insert buffer,可以將多條insert語(yǔ)句先寫入共享內(nèi)存緩沖區(qū)中,當(dāng)緩沖區(qū)滿或提交事務(wù)時(shí),大塊寫入數(shù)據(jù)庫(kù)中。因?yàn)闇p少了寫緩沖區(qū)的I/O次數(shù),故性能得到提高。插入游標(biāo)語(yǔ)法: $declare cursor_n
32、ame cursor for insert into tabnem(.) values (.); $open cursor_name; $put cursor_name; 或者,$prepare insert_name from “insert into tabname(.) values(.); $declare cursor_name cursor for insert_name; $open cursor_name; $put cursor_name;(2)使用with hold聲明游標(biāo)在使用游標(biāo)的操作中,open游標(biāo)的操作是最
33、耗時(shí)的,因?yàn)镾QL語(yǔ)句的合法性檢查、解析、語(yǔ)<分析、優(yōu)化等都是在該步進(jìn)行的。游標(biāo)如果以缺省定義的方式打開(kāi),在事務(wù)結(jié)束后將被自動(dòng)關(guān)閉。對(duì)本例數(shù)量較多的小事務(wù)而言,就存在著游標(biāo)的頻繁打開(kāi)、自動(dòng)關(guān)閉狀況,性能必定會(huì)下降。在此我們不采用缺省定義方式,而是使用with hold聲明游標(biāo),這樣在子進(jìn)程循環(huán)體內(nèi)的每個(gè)小事務(wù)處理完成后,游標(biāo)將不關(guān)閉。即每個(gè)子進(jìn)程的所有事務(wù),只有第一個(gè)事務(wù)存在游標(biāo)的open操作,不再進(jìn)行游標(biāo)打開(kāi)操作。語(yǔ)法如:$declare sel_cur cursor with hold for sele_statment;(3)select語(yǔ)句使用列表選項(xiàng)使用select語(yǔ)句時(shí),采用
34、select col1,col2,.,coln from tabname,只把需要的列顯式選擇出來(lái),而不要采用select * from tabname。采用列表方式,可減少前后臺(tái)之間的數(shù)據(jù)通信量,從而減少磁盤I/O,同時(shí)當(dāng)訪問(wèn)的表結(jié)構(gòu)發(fā)生變化但列表中的字段不變時(shí),無(wú)需重新調(diào)試、編譯程序。(4)prepare語(yǔ)句的使用 在SQL中使用prepare語(yǔ)句后可以根據(jù)應(yīng)用程序提供的不同的values來(lái)執(zhí)行多遍,而語(yǔ)法分析卻僅執(zhí)行一遍。當(dāng)一個(gè)SQL語(yǔ)句在同一應(yīng)用程序中被重復(fù)執(zhí)行多遍時(shí),用prepare的方法可以大大提高性能和效率。prepare語(yǔ)法:$prepare p_id from “insert into tabname (.) values (.) (5)多進(jìn)程并發(fā)寫數(shù)據(jù)庫(kù)表在該實(shí)例中,對(duì)符合年費(fèi)扣收條件的銀行卡記錄,都要將處理成功或失敗的信息記錄下來(lái)。這就存在著多個(gè)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 畢業(yè)課題申報(bào)書范例
- 區(qū)級(jí)教師課題申報(bào)書
- 合同范本修訂
- 合伙分紅合同范本
- 微課題申報(bào)書
- 教改課題申報(bào)書怎么填
- 銜接課題申報(bào)書范文
- 員工持股合同范本
- 國(guó)家申報(bào)書課題名稱結(jié)構(gòu)
- 個(gè)人購(gòu)酒合同范本
- 2025年共青科技職業(yè)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫(kù)完整版
- 2025年上半年潛江市城市建設(shè)發(fā)展集團(tuán)招聘工作人員【52人】易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2024年江西應(yīng)用工程職業(yè)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫(kù)標(biāo)準(zhǔn)卷
- 新媒體營(yíng)銷(第三版) 課件全套 林海 項(xiàng)目1-6 新媒體營(yíng)銷認(rèn)知-新媒體營(yíng)銷數(shù)據(jù)分析
- 愚公移山英文 -中國(guó)故事英文版課件
- 營(yíng)銷手冊(cè)范本匯總(24個(gè)共)35.doc
- 美制統(tǒng)一螺紋表UNC_UNF DS
- 2012年北京大學(xué)醫(yī)學(xué)部外國(guó)留學(xué)生本科入學(xué)考試
- 七年級(jí)英語(yǔ)閱讀理解50篇(附答案)
- 乙酸乙酯的制備ppt課件
- 音樂(lè)之聲中英文臺(tái)詞
評(píng)論
0/150
提交評(píng)論