• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      Node.js對多種數(shù)據(jù)庫協(xié)同訪問實(shí)踐
      ——以圖書館短信服務(wù)系統(tǒng)為例

      2019-08-02 02:53:04劉紅衛(wèi)
      天津科技 2019年7期
      關(guān)鍵詞:代碼短信數(shù)據(jù)庫

      劉紅衛(wèi)

      (泰達(dá)圖書館檔案館 天津300457)

      0 引 言

      數(shù)據(jù)庫幾乎是信息管理系統(tǒng)開發(fā)中的標(biāo)配。數(shù)據(jù)庫的應(yīng)用,使得數(shù)據(jù)的管理井井有條,數(shù)據(jù)的利用也非常方便。在一個(gè)信息系統(tǒng)中一般都是訪問一個(gè)數(shù)據(jù)庫,但也有一些特殊的系統(tǒng),尤其是在原有多個(gè)信息系統(tǒng)上建立整合的應(yīng)用系統(tǒng),往往要對多種類型數(shù)據(jù)庫進(jìn)行訪問,以便對那些分散在異構(gòu)數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行協(xié)同訪問,然后再將數(shù)據(jù)重新整合進(jìn)行利用。

      1 圖書館短信服務(wù)系統(tǒng)

      隨著信息技術(shù)的進(jìn)步,移動(dòng)互聯(lián)網(wǎng)普遍應(yīng)用,短信已經(jīng)不是人們之間通訊的主要手段,但是短信以其隨身性和及時(shí)性,依然是當(dāng)今作為推送服務(wù)信息不可或缺的方式。

      筆者所在的圖書館自 2007年開始,應(yīng)用短信系統(tǒng)開展圖書館服務(wù),至今已有十多年的時(shí)間,舊的短信平臺(tái)系統(tǒng)是一臺(tái)中國移動(dòng)定制的硬件設(shè)備,配合短信貓的使用才能做到全網(wǎng)短信的發(fā)送,短信的業(yè)務(wù)邏輯實(shí)現(xiàn)也是在這臺(tái)設(shè)備上配置的。

      2018年中國移動(dòng)公司將短信平臺(tái)升級(jí)為云端方式,稱為云 MAS平臺(tái)。為了繼續(xù)保持短信服務(wù)的開展,我們考察云 MAS平臺(tái)的功能,發(fā)現(xiàn)其只提供了普通短信的發(fā)送功能,用戶通過瀏覽器直接登錄云 MAS平臺(tái),通過操作頁面的方式進(jìn)行短信發(fā)送,沒有提供像舊版本那樣,能與本單位系統(tǒng)相結(jié)合來定義的業(yè)務(wù)短信的配置功能,但是提供了HTTP、SDK、CMPP等方式的短信網(wǎng)關(guān)接口[1],需要自行編寫程序、開發(fā)系統(tǒng)。新的短信服務(wù)系統(tǒng)的相關(guān)數(shù)據(jù)庫和網(wǎng)絡(luò)拓?fù)淙鐖D1所示。

      圖1 數(shù)據(jù)庫訪問和網(wǎng)絡(luò)拓?fù)鋱DFig.1 Database access and network topology diagrams

      在圖 1中,LAS服務(wù)器上運(yùn)行著圖書館核心管理系統(tǒng),讀者借閱和圖書單冊信息存儲(chǔ)在 Oracle數(shù)據(jù)庫中。eCard服務(wù)器上運(yùn)行的是讀者證卡管理系統(tǒng),為了避免讀者接收到無關(guān)的服務(wù)短信,讀者可以自己定制所需要的短信類型,此項(xiàng)功能包括在 eCard系統(tǒng)中,讀者信息(包括手機(jī)號(hào)碼)、讀者定制服務(wù)信息和消費(fèi)信息存儲(chǔ)在 DB2數(shù)據(jù)庫中。短信服務(wù)器上運(yùn)行短信服務(wù)管理系統(tǒng),也就是需要開發(fā)的系統(tǒng),需要發(fā)送的服務(wù)短信內(nèi)容存放在本機(jī)的 Mysql數(shù)據(jù)庫中(在舊系統(tǒng)中有定制服務(wù)短信內(nèi)容的Web系統(tǒng),后臺(tái)是 MySql數(shù)據(jù)庫,這部分沿用,無需重新開發(fā),如此也可以縮短新系統(tǒng)的開發(fā)時(shí)間)。對于讀者手機(jī)號(hào)及所借圖書的到期情況等信息,需要從 LAS的Oracle數(shù)據(jù)庫和 eCard的 DB2數(shù)據(jù)庫中提取,然后將數(shù)據(jù)組裝成一條短信內(nèi)容,通過中國移動(dòng)(CMCC)短信網(wǎng)關(guān)提供的HTTP接口發(fā)送出去,最后將相關(guān)發(fā)送情況進(jìn)行登記。

      圖書館短信服務(wù)系統(tǒng),涉及的服務(wù)短信的類型如圖2所示。

      圖2 服務(wù)短信類型Fig.2 Type of SMS service

      上行短信是讀者發(fā)給系統(tǒng)的,由 CMCC網(wǎng)關(guān)接收轉(zhuǎn)發(fā)到系統(tǒng),系統(tǒng)接收分析后按要求提取信息再反饋給讀者。下行短信由系統(tǒng)按照讀者的定制情況直接發(fā)給讀者。另外,短信的發(fā)送有 2種情況,一對多是同樣的短信內(nèi)容發(fā)給多個(gè)讀者,一對一是對不同的讀者發(fā)送不同的短信內(nèi)容。上行短信的反饋信息都是一對一形式。

      目前,Node.js憑借其優(yōu)秀的性能受到全球各大公司的重視,如 eBay、Microsoft、PayPal、Uber、Yahoo等,國內(nèi)阿里巴巴、百度、騰訊等也在很多的項(xiàng)目中應(yīng)用,可見 Node.js的發(fā)展已經(jīng)很成熟,它能快速創(chuàng)建大規(guī)模的網(wǎng)絡(luò)應(yīng)用,處理高吞吐量的實(shí)時(shí)連接。Node.js有 Windows、Linux、macOS、SunOS、AIX等系統(tǒng)平臺(tái)版本,因而具有良好的跨平臺(tái)可移植性,可以在 Windows上開發(fā),然后部署到 Linux等其他系統(tǒng)上[2]。

      短信服務(wù)系統(tǒng)的服務(wù)器,采用的操作系統(tǒng)是CentOS 6.10版,綜合以往基于 Linux系統(tǒng)的開發(fā)經(jīng)驗(yàn),以及 Node.js對 Mysql、Oracle、DB2數(shù)據(jù)庫系統(tǒng)的強(qiáng)大支持和良好的性能,我們最終采用 Node.js進(jìn)行短信服務(wù)系統(tǒng)的開發(fā)工作。

      2 數(shù)據(jù)庫的訪問

      Node.js是通過數(shù)據(jù)庫訪問模塊實(shí)現(xiàn)對數(shù)據(jù)庫訪問的,訪問不同類型的數(shù)據(jù)庫需要加載不同的模塊,這些模塊的使用過程包括安裝、連接配置和訪問操作。

      2.1 模塊的安裝

      在短信服務(wù)系統(tǒng)中涉及的數(shù)據(jù)庫類型有 Mysql、Oracle和 DB2。Node.js訪問數(shù)據(jù)庫的模塊可以在npmjs.com搜尋,這里有廠商官方提供的以及個(gè)人編寫的很多模塊,良莠不齊,具體采用哪個(gè)需要甄別。我們根據(jù)模塊的使用量和使用效果選擇了 mysql、ibm_db、oracledb這3個(gè)模塊。

      mysql模塊的安裝比較簡單,只需使用命令 npm install mysql安裝即可。而 oracledb、ibm_db這 2個(gè)模塊,首先需要根據(jù)操作系統(tǒng)下載并安裝驅(qū)動(dòng)程序,然后再進(jìn)行編譯和安裝。下面將安裝過程中需要注意的問題進(jìn)行總結(jié)。

      2.1.1 ibm_db模塊

      選擇 Node.js 8.12版。首先,安裝 gcc和 gccc++(即g++,在CentOS中稱為gcc-c++),安裝后gcc版本如果是 4.7,需要升級(jí)到 4.8,再安裝 devtoolset-2-gcc、devtoolset-2-binutils、devtoolset-2-gcc-c++ 3 個(gè)軟件包,它們會(huì)被安裝在/opt/rh/devtoolset-2/root/中,要注意在/usr/bin中建立它們的軟連接,以便使用。

      然后,安裝DB2客戶端程序,在/app文件夾中釋放linuxx64_odbc_cli.tar.gz,再在/etc/profile文件中增加以下環(huán)境變量。

      export LD_LIBRARY_PATH=/app/clidriver/lib:$LD_LIBRARY_PATH

      最后是安裝 ibm_db。使用命令 npm install ibm_db并注意此時(shí)在系統(tǒng)環(huán)境中不能有IBM_DB_HOME變量定義,否則無法安裝,如果變量已經(jīng)定義,則用 export n IBM_DB_HOME命令去掉。當(dāng)安裝過程提示訪問權(quán)限問題時(shí),使用下面的命令:

      npm install --unsafe-perm=true --allow-root ibm_db

      命令執(zhí)行完成后,進(jìn)入 node_modules/ibm_db目錄中,首先需要定義變量 export IBM_DB_HOME=/app/clidriver,然后執(zhí)行以下命令:

      node-gyp configure build --IBM_DB_HOME=$IBM_DB_HOME --IS_DOWNLOADED=false -verbose[3]

      在編譯過程可能會(huì)有警告出現(xiàn),不用理會(huì),只要執(zhí)行過程中沒有報(bào)錯(cuò)就說明安裝成功了。

      2.1.2 oracledb模塊

      首先,安裝 oracle instant client,12.2.0.1.0 版,可到 oracle官網(wǎng)下載 instantclient-basic-linux.x64-12.2.0.1.0.zip文件,解壓縮到指定目錄。

      然后,把下面的內(nèi)容寫入環(huán)境變量文件/etc/profile中:

      export ORACLE_HOME=/app/instantclient_12_2

      export PATH=$ORACLE_HOME:$PATH

      export LD_LIBRARY_PATH=$ORACLE_HOME:$LD_LIBRARY_PATH

      export TNS_ADMIN=$ORACLE_HOME/tns

      最后,安裝 oracledb 模塊,運(yùn)行命令npm install oracledb[4],如果出現(xiàn)訪問權(quán)限問題,則使用下面的命令安裝:

      npm install --unsafe-perm=true --allow-root oracledb

      2.2 連接方式

      首先,引入模塊并定義數(shù)據(jù)庫連接參數(shù),再建立數(shù)據(jù)庫的鏈接,然后執(zhí)行 sql查詢語句并獲取數(shù)據(jù),最后關(guān)閉連接。下面是使用mysql模塊獲取預(yù)設(shè)的短信內(nèi)容的例子。

      下面代碼是執(zhí)行查詢語句并獲取數(shù)據(jù)。

      其他數(shù)據(jù)庫訪問模塊的使用方法大同小異,只是一些代碼細(xì)節(jié)有所不同,如 oracledb中使用connection.execute語句來執(zhí)行 sql查詢語句獲取數(shù)據(jù),具體使用方法還需仔細(xì)閱讀相關(guān)文檔。

      3 數(shù)據(jù)庫連接池

      數(shù)據(jù)庫連接池負(fù)責(zé)分配、管理和釋放數(shù)據(jù)庫連接,它允許應(yīng)用程序重復(fù)使用一個(gè)現(xiàn)有的數(shù)據(jù)庫連接,而不是再重新建立一個(gè);釋放空閑時(shí)間超過最大空閑時(shí)間的數(shù)據(jù)庫連接來避免因?yàn)闆]有釋放數(shù)據(jù)庫連接而引起的數(shù)據(jù)庫連接遺漏。這項(xiàng)技術(shù)能明顯提高對數(shù)據(jù)庫操作的性能[5]。

      在 Node.js中可以方便地使用數(shù)據(jù)庫連接池技術(shù),以oracle為例,在oracledb中連接池的最大連接數(shù)poolMax缺省是4,通過代碼可以設(shè)置。

      var oracledb=require('oracledb');oracledb.pool Max=10;

      下面一段代碼是短信服務(wù)系統(tǒng)中完整的應(yīng)用oralcedb連接池的例子。義數(shù)據(jù)庫連接池的名字

      使用數(shù)據(jù)庫連接池技術(shù),并發(fā)執(zhí)行數(shù)量越大時(shí)比普通連接方式越有明顯的優(yōu)勢,程序執(zhí)行效率高,支持的最大并發(fā)執(zhí)行數(shù)也會(huì)遠(yuǎn)超普通連接。

      4 數(shù)據(jù)庫的異步操作

      Node.js的異步處理是其精華所在,可以有效地利用資源,提高系統(tǒng)的性能,更好地改善用戶的體驗(yàn),同樣會(huì)提高對多種數(shù)據(jù)庫協(xié)同訪問的效率,但也使編程的難度提高了很多。傳統(tǒng)的 Node.js在處理異步問題時(shí),一般采用callback回調(diào)的方式,callback回調(diào)存在一個(gè)很嚴(yán)重的金字塔問題——大量的回調(diào)函數(shù)慢慢向右側(cè)屏幕延伸的一種狀態(tài)[6]。回調(diào)函數(shù)嵌套過多,可讀性極差,容易出錯(cuò),形成“回調(diào)地獄”。

      Promise為 Javascript中的改進(jìn)鋪平了道路。EcmaScript 2017以 async和 await語句的形式,在JavaScript的 Promise之上引入了語法糖。它們允許編寫基于 Promise的代碼,就好像它是同步的,但不會(huì)阻塞主線程[7]。

      在Node.js版本8中已經(jīng)支持async和await語法。async函數(shù)返回一個(gè)Promise對象,當(dāng)函數(shù)執(zhí)行的時(shí)候,一旦遇到 await就會(huì)先等待,等到異步操作完成,再接著執(zhí)行函數(shù)體內(nèi)后面的語句。這樣就將異步的代碼寫成同步的形式,代碼容易理解,可讀性大為提高,減少代碼錯(cuò)誤的產(chǎn)生,避免了“回調(diào)地獄”發(fā)生。下段代碼是發(fā)送“年檢提醒”訪問數(shù)據(jù)庫的程序,從中可見一斑。

      5 結(jié) 語

      圖書館短信服務(wù)系統(tǒng)從2018年10月上線至今,系統(tǒng)運(yùn)行穩(wěn)定,處理速度快。這說明 Node.js應(yīng)用于多種異構(gòu)數(shù)據(jù)庫的協(xié)同訪問,效果良好,異步和并發(fā)的性能優(yōu)異、穩(wěn)定可靠,是一個(gè)值得采用和深入研究的方案。

      Node.js自身哲學(xué)是花最小的硬件成本,追求更高的并發(fā),更高的處理性能[8]。Node.js使用的是JavaScript語言,相對學(xué)習(xí)成本較低、模塊化的開發(fā)模式,可以利用的資源豐富,現(xiàn)在已經(jīng)形成了完整的資源生態(tài),而且社區(qū)發(fā)達(dá),許多人把問題都放到社區(qū)交流討論,可以幫助縮短開發(fā)周期。另外,開發(fā)中所用的操作系統(tǒng)、工具、模塊大都是免費(fèi)的,運(yùn)行時(shí)系統(tǒng)對硬件資源的消耗相對于其他流行語言如 Java要小,這也降低了開發(fā)成本。

      Node.js經(jīng)歷了10年的發(fā)展歷程,今后一定會(huì)更加完善,它的使用范圍有待我們進(jìn)一步探索。

      猜你喜歡
      代碼短信數(shù)據(jù)庫
      道歉短信
      創(chuàng)世代碼
      創(chuàng)世代碼
      創(chuàng)世代碼
      創(chuàng)世代碼
      代發(fā)短信
      數(shù)據(jù)庫
      數(shù)據(jù)庫
      數(shù)據(jù)庫
      數(shù)據(jù)庫
      临沂市| 年辖:市辖区| 兴化市| 巫溪县| 波密县| 厦门市| 三都| 东丰县| 平山县| 阜宁县| 古蔺县| 斗六市| 平乡县| 祁门县| 大厂| 大港区| 辽宁省| 正镶白旗| 长宁区| 柳林县| 兴隆县| 本溪| 平江县| 子洲县| 望谟县| 德昌县| 和平县| 石阡县| 长寿区| 定兴县| 嵊州市| 水城县| 会昌县| 兰考县| 佳木斯市| 涞源县| 万安县| 吕梁市| 贺兰县| 马鞍山市| 陵水|