国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

對(duì)Linux平臺(tái)OCI接口斷網(wǎng)阻塞問(wèn)題的處理

2019-01-30 08:05:32顧鵬程
電子技術(shù)與軟件工程 2019年2期
關(guān)鍵詞:線程調(diào)用隊(duì)列

文/顧鵬程

1 引言

OCI是Oracle公司提供的Oracle數(shù)據(jù)庫(kù)的C接口。一些監(jiān)控系統(tǒng),如軌道交通監(jiān)控系統(tǒng)、電力調(diào)度系統(tǒng)等,需要在Linux平臺(tái)對(duì)OCI進(jìn)行封裝。這類系統(tǒng)實(shí)時(shí)性要求較高,而OCI接口在Linux平臺(tái)存在斷網(wǎng)阻塞問(wèn)題,這大大影響了系統(tǒng)實(shí)時(shí)性。本文提出一種對(duì)已封裝Linux平臺(tái)OCI接口的改進(jìn)方法,可在接口斷網(wǎng)阻塞時(shí)快速切換至備網(wǎng)。

2 OCI網(wǎng)絡(luò)阻塞問(wèn)題描述

長(zhǎng)期不間斷運(yùn)行的系統(tǒng)不可避免會(huì)出現(xiàn)數(shù)據(jù)庫(kù)服務(wù)器網(wǎng)線插拔或松動(dòng)等問(wèn)題,如果故障未及時(shí)恢復(fù),OCI函數(shù)將長(zhǎng)時(shí)間阻塞,例如在Ubuntu系統(tǒng)可能長(zhǎng)達(dá)二十多分鐘,這在大多數(shù)情況下是不允許的。監(jiān)控系統(tǒng)一般配備主備網(wǎng)絡(luò),因此開(kāi)發(fā)者往往希望當(dāng)發(fā)生阻塞時(shí),數(shù)據(jù)庫(kù)接口能夠自動(dòng)切換網(wǎng)絡(luò)。

3 阻塞問(wèn)題處理

3.1 理論分析

在Linux系統(tǒng)中對(duì)于阻塞的解決通常使用sigalarm信號(hào),指定信號(hào)觸發(fā)時(shí)間,在可能的阻塞模塊前調(diào)用alarm函數(shù)。經(jīng)過(guò)實(shí)驗(yàn),該方法只是對(duì)現(xiàn)有進(jìn)程的打斷,無(wú)法對(duì)接口函數(shù)給出錯(cuò)誤返回值,且需退出進(jìn)程,無(wú)法保證事務(wù)連貫。

還有采用線程和條件變量相結(jié)合的處理方法,將接口函數(shù)置于線程中執(zhí)行,用條件變量計(jì)時(shí)等待接口函數(shù)返回。該方法不必退出程序,但未考慮主備網(wǎng)絡(luò)切換,且條件變量方法存在弊端,即當(dāng)信號(hào)先于等待發(fā)出時(shí),信號(hào)將不再起作用,導(dǎo)致等待無(wú)法返回。

圖1:任務(wù)流程

本文以上方法進(jìn)行總結(jié),提出一種結(jié)合泛型、線程、信號(hào)量方法的阻塞式任務(wù)線程方法,避免了上述方法的弊端,能夠在接口阻塞時(shí)自動(dòng)切換網(wǎng)絡(luò)。

3.2 處理流程

首先在創(chuàng)建數(shù)據(jù)庫(kù)連接時(shí),創(chuàng)建一個(gè)任務(wù)線程,負(fù)責(zé)執(zhí)行接口函數(shù)。接口函數(shù)通過(guò)泛型進(jìn)入線程。當(dāng)線程被獲得任務(wù)時(shí),觸發(fā)“任務(wù)”信號(hào)以執(zhí)行任務(wù)。當(dāng)任務(wù)結(jié)束時(shí),觸發(fā)“返回”信號(hào),主線程返回結(jié)果。調(diào)用接口函數(shù)的模塊在獲得“返回”信號(hào)前將一直阻塞并計(jì)時(shí),當(dāng)任務(wù)超時(shí),采取tnsping的方式對(duì)網(wǎng)絡(luò)狀況進(jìn)行判斷,若網(wǎng)絡(luò)未斷將繼續(xù)等待;若網(wǎng)絡(luò)斷開(kāi),將創(chuàng)建備用線程和備用網(wǎng)絡(luò)數(shù)據(jù)庫(kù)連接,而后執(zhí)行阻塞任務(wù),并退出原線程。具體流程如圖1所示。

3.3 關(guān)鍵代碼實(shí)現(xiàn)

本文采用VC10實(shí)現(xiàn)。泛型部分參考了任務(wù)隊(duì)列的方法,增加了支持不同返回類型的修改。首先定義模版類class Base,結(jié)構(gòu)體struct task_unit由class Base指針對(duì)象構(gòu)造,表示任意函數(shù)任務(wù)。任務(wù)的產(chǎn)生由templatestatic task_unit gen(FUNCT func_, ARG1 arg1_...)實(shí)現(xiàn)。如果涉及引用類型參數(shù),需要在函數(shù)中加入相應(yīng)的引用符號(hào)。

阻塞任務(wù)隊(duì)列部分采用ACE庫(kù)實(shí)現(xiàn),也可以選擇Linux的C++標(biāo)準(zhǔn)庫(kù)實(shí)現(xiàn)。線程類繼承ACE_Task_Base,信號(hào)量采用ACE_Semaphore,“任務(wù)”信號(hào)初始化為 t_sem(0),“返回”信號(hào)初始化為r_sem(0)。線程通過(guò)調(diào)用t_sem.acquire()等待任務(wù)注入。主線程將任務(wù)注入任務(wù)線程后,調(diào)用t_sem.release()觸發(fā)任務(wù)執(zhí)行,調(diào)用r_sem.acquire(&timeout)等待任務(wù)完成,其中timeout為超時(shí)設(shè)置。任務(wù)結(jié)束時(shí),線程調(diào)用ret_sem.release(),使主線程獲得返回值。

4 結(jié)論

本文方法對(duì)Linux平臺(tái)OCI接口的網(wǎng)絡(luò)阻塞問(wèn)題進(jìn)行處理,針對(duì)已封裝的接口函數(shù),只需利用泛型、多線程、信號(hào)量,即可構(gòu)造一個(gè)通用的阻塞模式任務(wù)隊(duì)列,將接口函數(shù)置于阻塞任務(wù)隊(duì)列下,在網(wǎng)絡(luò)阻塞時(shí),通關(guān)新的線程調(diào)用備用網(wǎng)絡(luò),解決了原本OCI接口函數(shù)長(zhǎng)時(shí)間阻塞的問(wèn)題。經(jīng)過(guò)實(shí)驗(yàn),該方法對(duì)舊有接口的改造工作量小,并且能實(shí)現(xiàn)應(yīng)用的數(shù)據(jù)庫(kù)連接在網(wǎng)絡(luò)發(fā)生通斷問(wèn)題時(shí)進(jìn)行自動(dòng)切換。

猜你喜歡
線程調(diào)用隊(duì)列
隊(duì)列里的小秘密
基于多隊(duì)列切換的SDN擁塞控制*
軟件(2020年3期)2020-04-20 00:58:44
核電項(xiàng)目物項(xiàng)調(diào)用管理的應(yīng)用研究
在隊(duì)列里
LabWindows/CVI下基于ActiveX技術(shù)的Excel調(diào)用
豐田加速駛?cè)胱詣?dòng)駕駛隊(duì)列
淺談linux多線程協(xié)作
基于系統(tǒng)調(diào)用的惡意軟件檢測(cè)技術(shù)研究
利用RFC技術(shù)實(shí)現(xiàn)SAP系統(tǒng)接口通信
Linux線程實(shí)現(xiàn)技術(shù)研究
焦作市| 兴宁市| 甘肃省| 阿克| 远安县| 东源县| 五常市| 汉寿县| 兴和县| 汉中市| 闽清县| 黄冈市| 西林县| 蒲城县| 普洱| 陇西县| 内丘县| 依兰县| 湖南省| 英山县| 张家港市| 松阳县| 彭泽县| 丰县| 苗栗县| 伊宁市| 夏邑县| 盘锦市| 锦屏县| 溧水县| 乡城县| 建昌县| 吉隆县| 罗源县| 北海市| 大荔县| 若羌县| 鸡泽县| 衢州市| 资兴市| 宿松县|