本發(fā)明涉及對多文件處理的研究領(lǐng)域,特別涉及一種支持分布式多文件導入的系統(tǒng)及方法。
背景技術(shù):
隨著信息化的發(fā)展,各企業(yè)間都出現(xiàn)了各種功能的企業(yè)化軟件,數(shù)據(jù)導入是數(shù)據(jù)的重要來源。隨著數(shù)據(jù)量的積累,需要導入的數(shù)據(jù)量也越來越大,這些數(shù)據(jù)有可能是以文檔的方式保存,如excel文檔、csv文檔、word文檔、txt文檔等等。軟件對文檔進行數(shù)據(jù)讀取,對數(shù)據(jù)進行驗證,轉(zhuǎn)換數(shù)據(jù)結(jié)構(gòu),把數(shù)據(jù)批量插入到數(shù)據(jù)庫,形成系統(tǒng)數(shù)據(jù)。
目前對于數(shù)據(jù)文件的導入實現(xiàn)方法主要是兩種:
在客戶端讀取文件數(shù)據(jù),對數(shù)據(jù)進行驗證后形成結(jié)構(gòu)化的數(shù)據(jù),將數(shù)據(jù)傳輸?shù)椒斩?,對?shù)據(jù)進行批量插入。該實現(xiàn)方法對于數(shù)據(jù)量小的文件,在客戶端進行讀取驗證是完全沒問題;但是如果對于大文件的數(shù)據(jù)導入,在進行文件數(shù)據(jù)讀取時會消耗客戶端的大量資源,導致系統(tǒng)卡頓、不能正常使用,甚至系統(tǒng)內(nèi)存溢出導致系統(tǒng)崩潰。
在服務端進行大文件數(shù)據(jù)的讀取,通常服務器的配置較好。對于單個大文件數(shù)據(jù)讀取,相對于服務器資源占用較少,不會對服務器造成影響;但同時(并發(fā))處理多個大文件數(shù)據(jù)讀取時,則會占用服務器大量的資源,有可能直接影響其他客戶端對于系統(tǒng)的使用,影響系統(tǒng)使用體驗。如果對于占用的資源不能及時的釋放,可能最終導致服務器崩潰,對系統(tǒng)的影響更是致命的。
針對以上風險,我們需要一種支持分布式多文件導入的方法,以解決對于大文件數(shù)據(jù)導入的問題。
技術(shù)實現(xiàn)要素:
本發(fā)明的主要目的在于克服現(xiàn)有技術(shù)的缺點與不足,提供一種支持分布式多文件導入的系統(tǒng)及方法,該方法支持對文件的傳輸、數(shù)據(jù)讀取、數(shù)據(jù)驗證、數(shù)據(jù)結(jié)構(gòu)化、數(shù)據(jù)傳輸、文件保存。
為了達到上述目的,本發(fā)明采用以下技術(shù)方案:
本發(fā)明的一種支持分布式多文件導入的系統(tǒng),包括服務層、業(yè)務處理層以及數(shù)據(jù)庫,所述服務層,為用戶體現(xiàn)了服務的接口;所述業(yè)務處理層,對業(yè)務數(shù)據(jù)進行處理;所述數(shù)據(jù)庫,記錄導入服務的一些基礎(chǔ)數(shù)據(jù),并保存文件的臨時數(shù)據(jù),文件數(shù)據(jù)讀取出來后都保存在數(shù)據(jù)庫中,后續(xù)的數(shù)據(jù)驗證,導入都直接操作數(shù)據(jù)庫數(shù)據(jù);
所述服務層包括文件保存服務模塊、數(shù)據(jù)讀取與驗證請求模塊、以及目標數(shù)據(jù)傳輸模塊;所述文件保存服務模塊,用于提供給用戶上傳文件的服務,可單獨使用該服務,也可以作為文件服務器,用作保存文件;所述數(shù)據(jù)讀取與驗證請求模塊,用于用戶在完成文件上傳后,調(diào)用該請求把文件數(shù)據(jù)讀取出來并批量插入到數(shù)據(jù)庫中,并執(zhí)行驗證存儲過程以進行數(shù)據(jù)驗證;所述目標數(shù)據(jù)傳輸模塊,用于在執(zhí)行完成數(shù)據(jù)插入后,讀取數(shù)據(jù)并對數(shù)據(jù)進行結(jié)構(gòu)化整理,并將數(shù)據(jù)返回給用戶;
所述業(yè)務處理層包括文件讀取組件、消息隊列組件、數(shù)據(jù)驗證組件、以及數(shù)據(jù)庫操作組件;所述文件讀取組件,用于對多種格式的文檔進行讀取,并保證讀取的組件可擴展;所述消息隊列組件,用于根據(jù)服務所分配的資源,對服務的使用做限制,同時對并發(fā)數(shù)根據(jù)服務器資源進行配置,當并發(fā)數(shù)量大于配置數(shù)時,服務的請求將進入消息隊列,只有之前請求的服務完成文件讀取,并釋放資源后,請求從消息隊列調(diào)出并執(zhí)行請求;所述數(shù)據(jù)驗證組件,用作對數(shù)據(jù)的驗證,數(shù)據(jù)驗證的方法由存儲過程實現(xiàn),而存儲過程與數(shù)據(jù)類別驗證的映射關(guān)系會保存在數(shù)據(jù)表中,該組件的最大作用就是處理存儲過程與數(shù)據(jù)類別驗證的映射關(guān)系,并執(zhí)行存續(xù)過程進行數(shù)據(jù)驗證;所述數(shù)據(jù)庫操作組件,是對數(shù)據(jù)庫訪問、操作的類,該服務中所有對數(shù)據(jù)庫的操作最終都會應用該組件進行實現(xiàn),包括執(zhí)行數(shù)據(jù)驗證的存儲過程。
作為優(yōu)選的技術(shù)方案,所述文件讀取組件是對txt文件、excel文件、csv文件、word格式文件的讀取。
作為優(yōu)選的技術(shù)方案,所述數(shù)據(jù)庫為輕量級數(shù)據(jù)庫,選用Mysql數(shù)據(jù)庫或者微軟的Access。
本發(fā)明還公開了一種支持分布式多文件導入的方法,包括下述步驟:
S1、請求文件保存服務,對文件進行上傳,完成上傳后,把文件記錄保存到數(shù)據(jù)庫中;
S2、請求數(shù)據(jù)讀取與數(shù)據(jù)驗證:
S2.1、收到請求后,服務首先根據(jù)當前請求的用戶數(shù)判斷是否超過配置的最大數(shù)量,如果大于則把請求插入到消息隊列中,等待前面請求的用戶完成后,才能處理請求;
S2.2、數(shù)據(jù)讀取與插入數(shù)據(jù)庫,調(diào)用文件讀取組件,讀取文件的數(shù)據(jù),并根據(jù)讀取出來的數(shù)據(jù)結(jié)構(gòu)在數(shù)據(jù)庫中生成對應的臨時表,將數(shù)據(jù)批量插入到臨時表中,并釋放讀取文件的資源;
S2.3、根據(jù)請求中的數(shù)據(jù)類型,根據(jù)映射關(guān)系找到該數(shù)據(jù)類型的數(shù)據(jù)驗證存儲過程,并調(diào)用存儲過程,將不符合規(guī)范的數(shù)據(jù)抽取到數(shù)據(jù)錯誤的驗證表,并在臨時表中刪除這些數(shù)據(jù);
S3、最終數(shù)據(jù)的返回,讀取驗證之后的數(shù)據(jù),并返回最終的數(shù)據(jù)給用戶,用戶可以直接拿到數(shù)據(jù)做批量插入,從而完成文件數(shù)據(jù)導入;
S4、完成數(shù)據(jù)導入后,刪除導入服務的臨時數(shù)據(jù)、臨時表結(jié)構(gòu)、臨時配置數(shù)據(jù)。
作為優(yōu)選的技術(shù)方案,步驟S2.2中,具體為:以數(shù)據(jù)表格式從文檔中讀取出數(shù)據(jù),數(shù)據(jù)表包括了數(shù)據(jù)行與數(shù)據(jù)列,根據(jù)數(shù)據(jù)列的數(shù)量定義臨時表,表名和欄位名稱的定義由規(guī)則定義在數(shù)據(jù)庫中生成物理表,并在數(shù)據(jù)庫中記錄文件名與數(shù)據(jù)表的映射關(guān)系、文件數(shù)據(jù)欄位與臨時表欄位的映射關(guān)系,然后把數(shù)據(jù)都插入到臨時表中,完成數(shù)據(jù)庫對文件數(shù)據(jù)的存儲,同時根據(jù)該結(jié)構(gòu)生成一個記錄異常數(shù)據(jù)的數(shù)據(jù)表,最后釋放讀取文件的資源。
作為優(yōu)選的技術(shù)方案,步驟S3中,步驟S2.3中具體為:
在確定數(shù)據(jù)要求與數(shù)據(jù)格式的情況下,通過數(shù)據(jù)庫存儲過程對數(shù)據(jù)進行驗證篩選,數(shù)據(jù)驗證的存儲過程通過創(chuàng)建歷史表時產(chǎn)生的映射關(guān)系,可以確定表結(jié)構(gòu)的信息,根據(jù)驗證的規(guī)則,把異常數(shù)據(jù)抽取到對應的異常數(shù)據(jù)表,其中在生成臨時表的同時生成了對應的異常數(shù)據(jù)表。作為優(yōu)選的技術(shù)方案,步驟S3中,在讀取驗證的數(shù)據(jù)時,進行分批次讀取,每批次讀取N條數(shù)據(jù),數(shù)據(jù)數(shù)可配置。
作為優(yōu)選的技術(shù)方案,步驟S3中,還包括下述步驟:
把數(shù)據(jù)轉(zhuǎn)換成用戶指定的數(shù)據(jù)結(jié)構(gòu),所述數(shù)據(jù)結(jié)構(gòu)是與數(shù)據(jù)格式相對應的實體。
本發(fā)明與現(xiàn)有技術(shù)相比,具有如下優(yōu)點和有益效果:
1.本服務不依賴任何的程序或系統(tǒng)軟件,可隨時引用或拋棄;
2.本發(fā)明可以讀取多種不同格式的文檔數(shù)據(jù),包括excel、csv、word、txt等,并有很強的擴展性,能輕易擴展讀取更多文檔格式的數(shù)據(jù);
3.本發(fā)明適合文件數(shù)據(jù)導入的功能,而且不會影響到系統(tǒng)服務端和客戶端的使用;并且增加了易擴展的數(shù)據(jù)驗證方法,讓文件數(shù)據(jù)導入更簡單;
4.本發(fā)明不用擔心并發(fā)量大時,會導致服務器的資源利用問題,導致程序崩潰。
附圖說明
圖1是本發(fā)明的服務結(jié)構(gòu)示意圖;
圖2是本發(fā)明的功能流程圖。
具體實施方式
下面結(jié)合實施例及附圖對本發(fā)明作進一步詳細的描述,但本發(fā)明的實施方式不限于此。
實施例
為實現(xiàn)支持分布式多文件導入服務,采取分布式的技術(shù)架構(gòu)。整套技術(shù)方案包括了:數(shù)據(jù)傳輸服務、文件讀取組件、消息隊列組件、輕量級數(shù)據(jù)庫。
數(shù)據(jù)傳輸服務可以采用微軟的WCF、WebService、Socket等通信服務,以滿足對文件的傳輸和數(shù)據(jù)的傳輸,保證傳輸?shù)姆€(wěn)定性。
文件讀取組件,目前主要涵蓋了對txt文件、excel文件、csv文件、word文件等格式文件的讀取。在實現(xiàn)過程采用設(shè)計模式進行設(shè)計,保證讀取組件的可擴展性。
由于服務器的資源是有限的,會根據(jù)服務所分配的資源,對服務的使用(最主要是控制文件讀取的數(shù)量)做限制,以保證服務能正常使用。所以引用了消息隊列的組件,以解決該問題。并發(fā)數(shù)可以根據(jù)服務器資源進行配置。當并發(fā)數(shù)量大于配置數(shù)時,服務的請求將進入消息隊列,只有之前請求的服務完成文件讀取,并釋放資源后,請求從消息隊列調(diào)出并執(zhí)行請求。
為該服務配置的輕量級數(shù)據(jù)庫,可以選用Mysql數(shù)據(jù)庫或者微軟的Access,數(shù)據(jù)庫中的作用有:
1.記錄導入服務的一些基礎(chǔ)數(shù)據(jù),如配置數(shù)據(jù),文件保存的數(shù)據(jù)等;
2.保存文件的臨時數(shù)據(jù),文件數(shù)據(jù)讀取出來后都保存在數(shù)據(jù)庫中,后續(xù)的數(shù)據(jù)驗證,導入都直接操作數(shù)據(jù)庫數(shù)據(jù),減少對服務器資源的占用;
3.數(shù)據(jù)驗證的工作利用存儲過程驗證,存儲過程可以靈活執(zhí)行,只需要執(zhí)行數(shù)據(jù)腳本即可生成,不需要依賴服務程序。
如圖1所示,本發(fā)明的結(jié)構(gòu)圖,服務層體現(xiàn)了服務的接口,業(yè)務處理層體現(xiàn)了業(yè)務處理中所需要引用的組件,及數(shù)據(jù)庫的使用:
1.服務層,為用戶體現(xiàn)了該服務的接口。文件保存服務,提供給用戶上傳文件的服務,單獨使用該服務,也可以作為文件服務器,用作保存文件;數(shù)據(jù)讀取與驗證請求,用戶在完成文件上傳后,可以調(diào)用該請求把文件數(shù)據(jù)讀取出來并批量插入到數(shù)據(jù)庫中,并執(zhí)行驗證存儲過程以進行數(shù)據(jù)驗證;目標數(shù)據(jù)傳輸服務,用于在執(zhí)行完成數(shù)據(jù)插入后,讀取數(shù)據(jù)并對數(shù)據(jù)進行結(jié)構(gòu)化整理,并將數(shù)據(jù)返回給用戶。
2.業(yè)務處理層,文件讀取組件和消息隊列組件分別在前面進行了介紹,在此不再贅述;數(shù)據(jù)驗證組件,用作對數(shù)據(jù)的驗證,數(shù)據(jù)驗證的方法由存儲過程實現(xiàn),而存儲過程與數(shù)據(jù)類別驗證的映射關(guān)系會保存在數(shù)據(jù)表中,該組件的最大作用就是處理存儲過程與數(shù)據(jù)類別驗證的映射關(guān)系,并執(zhí)行存續(xù)過程進行數(shù)據(jù)驗證;數(shù)據(jù)庫操作組件,是對數(shù)據(jù)庫訪問、操作的類,該服務中所有對數(shù)據(jù)庫的操作最終都會應用該組件進行實現(xiàn),包括執(zhí)行數(shù)據(jù)驗證的存儲過程。
如圖2所示為本發(fā)明的使用方法步驟:
步驟一請求文件保存服務,對文件進行上傳,完成上傳后,把文件記錄保存到數(shù)據(jù)庫中。
步驟二是請求數(shù)據(jù)讀取與數(shù)據(jù)驗證:
1.收到請求后,服務首先根據(jù)當前請求的用戶數(shù)判斷是否超過配置的最大數(shù)量,如果大于則把請求插入到消息隊列中,等待前面請求的用戶完成后,才能處理請求;
2.數(shù)據(jù)讀取與插入數(shù)據(jù)庫,調(diào)用文件讀取組件,讀取文件的數(shù)據(jù),并根據(jù)讀取出來的數(shù)據(jù)結(jié)構(gòu)在數(shù)據(jù)庫中生成對應的臨時表,將數(shù)據(jù)批量插入到臨時表中,并釋放讀取文件的資源;
3.根據(jù)請求中的數(shù)據(jù)類型,根據(jù)映射關(guān)系找到該數(shù)據(jù)類型的數(shù)據(jù)驗證存儲過程,并調(diào)用存儲過程,將不符合規(guī)范的數(shù)據(jù)抽取到數(shù)據(jù)錯誤的驗證表,并在臨時表中刪除這些數(shù)據(jù)。
步驟三最終數(shù)據(jù)的返回,讀取驗證之后的數(shù)據(jù)(可以分批讀取,每批次讀取N條數(shù)據(jù),數(shù)據(jù)數(shù)可配置),如果需要可把數(shù)據(jù)轉(zhuǎn)換成用戶指定的數(shù)據(jù)結(jié)構(gòu),并返回最終的數(shù)據(jù)給用戶。用戶可以直接拿到數(shù)據(jù)做批量插入,從而完成文件數(shù)據(jù)導入。
步驟四完成數(shù)據(jù)導入后,刪除導入服務的臨時數(shù)據(jù)、臨時表結(jié)構(gòu)、臨時配置數(shù)據(jù)。
上述實施例為本發(fā)明較佳的實施方式,但本發(fā)明的實施方式并不受上述實施例的限制,其他的任何未背離本發(fā)明的精神實質(zhì)與原理下所作的改變、修飾、替代、組合、簡化,均應為等效的置換方式,都包含在本發(fā)明的保護范圍之內(nèi)。