国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      一種數(shù)據(jù)庫數(shù)據(jù)讀寫方法和裝置與流程

      文檔序號:11830394閱讀:295來源:國知局
      一種數(shù)據(jù)庫數(shù)據(jù)讀寫方法和裝置與流程

      本發(fā)明涉及數(shù)據(jù)庫技術領域,尤指一種數(shù)據(jù)庫數(shù)據(jù)讀寫方法和裝置。



      背景技術:

      伴隨著新項目立項,構建新工程時,需要大量數(shù)據(jù)初始化數(shù)據(jù)庫,這些數(shù)據(jù)往往來自多個外圍系統(tǒng)數(shù)據(jù)庫,本系統(tǒng)的一個數(shù)據(jù)表經(jīng)常需要從多個外圍數(shù)據(jù)庫同步數(shù)據(jù),項目開始階段需要花費大量時間開發(fā)定時任務從不同數(shù)據(jù)庫的不同數(shù)據(jù)表中同步數(shù)據(jù)到本系統(tǒng)。

      通常情況下選擇一種流行的(ORM)數(shù)據(jù)庫映射框架,比如Hibernate,不用寫SQL語句,從外圍數(shù)據(jù)庫讀取,遍歷數(shù)據(jù)列表,逐條插入到數(shù)據(jù)庫中。這種模式在開發(fā)中效率較高,代碼編寫較快。

      但是在實際生產(chǎn)中,碰到幾十萬、上百萬甚至更龐大的數(shù)據(jù)時,這種方式無比緩慢,一個后臺同步數(shù)據(jù)任務,可能一周都跑不完。雖然很多模塊的開發(fā)工作都已完成,但是因為初始數(shù)據(jù)不滿足,無法得到正確的結果,反而延誤工作。



      技術實現(xiàn)要素:

      為了解決上述問題,本發(fā)明提出了一種數(shù)據(jù)庫數(shù)據(jù)讀寫方法和裝置,能夠提高數(shù)據(jù)庫同步業(yè)務的處理能力。

      為了達到上述目的,本發(fā)明提出了一種數(shù)據(jù)庫數(shù)據(jù)讀寫裝置,設置在數(shù)據(jù)服務器上,所述數(shù)據(jù)庫數(shù)據(jù)讀寫裝置包括:

      讀取單元,用于從應用服務器中讀取原始數(shù)據(jù),對所述原始數(shù)據(jù)進行封裝以得到目標數(shù)據(jù),并將所述目標數(shù)據(jù)存儲到緩存隊列中;

      提交單元,用于根據(jù)預設的緩存讀取條件,將緩存隊列中緩存的目標數(shù)據(jù)存儲到數(shù)據(jù)庫中。

      優(yōu)選地,所述讀取單元從應用服務器中讀取原始數(shù)據(jù)包括:

      從應用服務器中讀取條數(shù)為第一預定數(shù)目的原始數(shù)據(jù);

      在完成對第一預定數(shù)目的原始數(shù)據(jù)的封裝并得到對應的第一目標數(shù)據(jù),且第一目標數(shù)據(jù)全部存儲到緩存隊列之后,在沒有完成全部原始數(shù)據(jù)的讀取時,再次從應用服務器中讀取條數(shù)為第一預定數(shù)目的原始數(shù)據(jù)。

      優(yōu)選地,所述提交單元根據(jù)預設的緩存讀取條件,將緩存隊列中緩存的目標數(shù)據(jù)存儲到數(shù)據(jù)庫中包括:

      根據(jù)預定的讀取間隔,將緩存隊列中的目標數(shù)據(jù)批量存儲到數(shù)據(jù)庫中。

      優(yōu)選地,所述提交單元將所述目標數(shù)據(jù)批量存儲到數(shù)據(jù)庫中包括:

      預編譯存儲指令,每次向數(shù)據(jù)庫提交數(shù)據(jù)時,捆綁Ni條目標數(shù)據(jù)到存儲指令上,執(zhí)行存儲指令,以將Ni條目標數(shù)據(jù)存儲到數(shù)據(jù)庫中;其中,Ni為本次批量存儲需存儲數(shù)目。

      優(yōu)選地,所述提交單元根據(jù)預定的讀取間隔,將緩存隊列中的目標數(shù)據(jù)批量存儲到數(shù)據(jù)庫中包括:

      根據(jù)預設的批量保存條數(shù)Nx,依次批量保存緩存隊列中的目標數(shù)據(jù);每次保存的目標數(shù)據(jù)的最大數(shù)目為預設的批量保存條數(shù)Nx;

      其中,

      獲取緩存隊列中存儲的數(shù)據(jù)的長度N1;

      若N1小于或等于0,結束本次存儲操作;

      若N1大于0且小于或等于Nx,將N1條數(shù)據(jù)以批量存儲的方式存儲到數(shù)據(jù)庫中;

      若N1大于Nx,分N_subs次將目標數(shù)目存儲到數(shù)據(jù)庫中,其中,在第1次至第N_subs-1次,將Nx條數(shù)據(jù)存儲到數(shù)據(jù)庫中,在第N_subs次時,將Nx條目標數(shù)據(jù)存儲到數(shù)據(jù)庫中;其中,N_subs等于N1除以Nx的整數(shù)商加1。

      為了達到上述目的,本發(fā)明還提出了一種數(shù)據(jù)庫數(shù)據(jù)讀寫方法,所述方法包括:

      從應用服務器中讀取原始數(shù)據(jù),對所述原始數(shù)據(jù)進行封裝以得到目標數(shù)據(jù),并將所述目標數(shù)據(jù)存儲到緩存隊列中;

      根據(jù)預設的緩存讀取條件,將緩存隊列中緩存的目標數(shù)據(jù)存儲到數(shù)據(jù)庫中。

      優(yōu)選地,所述從應用服務器中讀取原始數(shù)據(jù)包括:

      從應用服務器中讀取條數(shù)為第一預定數(shù)目的原始數(shù)據(jù);

      在完成對第一預定數(shù)目的原始數(shù)據(jù)的封裝并得到對應的第一目標數(shù)據(jù),且第一目標數(shù)據(jù)全部存儲到緩存隊列之后,在沒有完成全部原始數(shù)據(jù)的讀取時,再次從應用服務器中讀取條數(shù)為第一預定數(shù)目的原始數(shù)據(jù)。

      優(yōu)選地,所述根據(jù)預設的緩存讀取條件,將緩存隊列中緩存的目標數(shù)據(jù)存儲到數(shù)據(jù)庫中包括:

      根據(jù)預定的讀取間隔,將緩存隊列中的目標數(shù)據(jù)批量存儲到數(shù)據(jù)庫中。

      優(yōu)選地,所述將所述目標數(shù)據(jù)批量存儲到數(shù)據(jù)庫中包括:

      預編譯存儲指令,每次向數(shù)據(jù)庫提交數(shù)據(jù)時,捆綁Ni條目標數(shù)據(jù)到存儲指令上,執(zhí)行存儲指令,以將Ni條目標數(shù)據(jù)存儲到數(shù)據(jù)庫中;其中,Ni為本次批量存儲需存儲數(shù)目。

      優(yōu)選地,所述根據(jù)預定的讀取間隔,將緩存隊列中的目標數(shù)據(jù)批量存儲到數(shù)據(jù)庫中包括:

      根據(jù)預設的批量保存條數(shù)Nx,依次批量保存緩存隊列中的目標數(shù)據(jù);每次保存的目標數(shù)據(jù)的最大數(shù)目為預設的批量保存條數(shù)Nx;

      其中,

      獲取緩存隊列中存儲的數(shù)據(jù)的長度N1;

      若N1小于或等于0,結束本次存儲操作;

      若N1大于0且小于或等于Nx,將N1條數(shù)據(jù)以批量存儲的方式存儲到數(shù)據(jù)庫中;

      若N1大于Nx,分N_subs次將目標數(shù)目存儲到數(shù)據(jù)庫中,其中,在第1次至第N_subs-1次,將Nx條數(shù)據(jù)存儲到數(shù)據(jù)庫中,在第N_subs次時,將Nx條目標數(shù)據(jù)存儲到數(shù)據(jù)庫中;其中,N_subs等于N1除以Nx的整數(shù)商加1。

      與現(xiàn)有技術相比,本發(fā)明提供的技術方案包括:數(shù)據(jù)庫數(shù)據(jù)讀寫裝置包括:讀取單元,用于從應用服務器中讀取原始數(shù)據(jù),對所述原始數(shù)據(jù)進行封裝以得到目標數(shù)據(jù),并將所述目標數(shù)據(jù)存儲到緩存隊列中;提交單元,用于根據(jù)預設的緩存讀取條件,將緩存隊列中緩存的目標數(shù)據(jù)存儲到數(shù)據(jù)庫中。通過本發(fā)明的方案,將數(shù)據(jù)庫數(shù)據(jù)同步過程中的讀寫任務分離,讀取單元從外圍數(shù)據(jù)庫讀取數(shù)據(jù)并封裝后,沒有直接存儲到數(shù)據(jù)庫,而是寫到高速緩存隊列中,緩存隊列具有較高的讀寫速率,從而提高了讀任務的效率,提交單元從隊列中取出數(shù)據(jù),按照給定步長,批量保存,從而提高寫任務的效率。讀取單元和提交單元在緩存隊列不發(fā)生阻塞的情況下,各自獨立運行,從而提高并發(fā)效率。

      附圖說明

      下面對本發(fā)明實施例中的附圖進行說明,實施例中的附圖是用于對本發(fā)明的進一步理解,與說明書一起用于解釋本發(fā)明,并不構成對本發(fā)明保護范圍的限制。

      圖1為本發(fā)明實施例提出的一種實施數(shù)據(jù)庫數(shù)據(jù)讀寫方法的系統(tǒng)架構示意圖;

      圖2為本發(fā)明實施例提出的一種數(shù)據(jù)庫數(shù)據(jù)讀寫裝置的結構示意圖;

      圖3為本發(fā)明實施例提供的一種數(shù)據(jù)庫數(shù)據(jù)讀寫方法的流程示意圖;

      圖4為本發(fā)明實施例提供的一種數(shù)據(jù)庫數(shù)據(jù)讀寫方法的流程示意圖。

      具體實施方式

      為了便于本領域技術人員的理解,下面結合附圖對本發(fā)明作進一步的描述,并不能用來限制本發(fā)明的保護范圍。需要說明的是,在不沖突的情況下,本申請中的實施例及實施例中的各種方式可以相互組合。

      應當理解,此處所描述的具體實施例僅用以解釋本發(fā)明,并不用于限定本發(fā)明。

      現(xiàn)在將參考附圖描述實現(xiàn)本發(fā)明各個實施例的移動終端。在后續(xù)的描述中,使用用于表示元件的諸如“模塊”、“部件”或“單元”的后綴僅為了有利于本發(fā)明的說明,其本身并沒有特定的意義。因此,"模塊"與"部件"可以混合地使用。

      本發(fā)明實施例中,從兩個維度來分解數(shù)據(jù)庫的數(shù)據(jù)同步任務,將傳統(tǒng)的數(shù)據(jù)同步任務進行讀寫剝離,通過維持一個高速緩存隊列暫時保持數(shù)據(jù),第一、從外圍的應用數(shù)據(jù)庫讀數(shù)據(jù),然后將數(shù)據(jù)寫到一個設置的高速緩存隊列中;第二、從高速緩存隊列取數(shù)據(jù),然后批量插入到本地數(shù)據(jù)庫中,保存過程中,設置一個批量步長,比如100,存儲數(shù)據(jù)達到100條之后,再一次commit(保存)到本地數(shù)據(jù)中,或者設置一個保存時長間隔,例如,10S,每次到達保存時長間隔時一次性commit到本地數(shù)據(jù)中。

      本發(fā)明實施例中,在將緩存隊列中的數(shù)據(jù)保存到數(shù)據(jù)庫時,采用JDBC保存。

      JDBC(Java Data Base Connectivity,java數(shù)據(jù)庫連接)是一種用于執(zhí)行SQL語句的Java API,可以為多種關系數(shù)據(jù)庫提供統(tǒng)一訪問,它由一組用Java語言編寫的類和接口組成。JDBC提供了一種基準,據(jù)此可以構建更高級的工具和接口,使數(shù)據(jù)庫開發(fā)人員能夠編寫數(shù)據(jù)庫應用程序。

      JDBC是Java語言執(zhí)行SQL訪問數(shù)據(jù)庫的標準接口。

      Hibernate是一個對象關系映射框架,在JDBC的基礎上進行封裝,將Java數(shù)據(jù)模型與數(shù)據(jù)庫表建立映射關系,自動生成SQL,是一個全自動的ORM框架。

      從執(zhí)行效率上考慮,JDBC無疑是最快的,單條數(shù)據(jù)上二者差異不大,但是在大數(shù)據(jù)操作數(shù)據(jù)庫情況下,Hibernate單條插入,需要進行對象映射、生成SQL等操作以及自身的機制問題使性能下降的非??欤琀ibernate批量操作只是按步長批量提交數(shù)據(jù)庫執(zhí)行映射的SQL,不是真正意義上的批量操作,JDBC的批量保存采用PreparedStatement接口預編譯執(zhí)行語句,能夠最大程度的優(yōu)化性能。

      首先,對實施本發(fā)明實施例提供的數(shù)據(jù)庫數(shù)據(jù)讀寫方法的系統(tǒng)架構進行說明。如圖所示,實施本發(fā)明實施例提供的數(shù)據(jù)庫數(shù)據(jù)讀寫方法的系統(tǒng)分4個層次,層次架構圖如1所示,其中,該系統(tǒng)中包括應用服務器、核心業(yè)務模塊、緩存隊列、數(shù)據(jù)持久層和操作系統(tǒng)。

      其中,應用服務器采用Tomcat服務器,實現(xiàn)模塊部署,所述應用服務器可以為多個。

      其中,核心業(yè)務模塊,核心業(yè)務模塊包括讀取單元和提交單元,讀取單元用于讀取外圍的應用數(shù)據(jù)庫,存入緩存隊列中,緩存隊列中存放的數(shù)據(jù)為本地數(shù)據(jù)的表數(shù)據(jù)模型;提交單元用于將緩存隊列的數(shù)據(jù)存儲到本地數(shù)據(jù)庫,其中,從緩存隊列中取出數(shù)據(jù)列表,分批插入數(shù)據(jù),其中,可以使用commit命令執(zhí)行插入。

      其中,緩存隊列為有界隊列,隊列滿時阻塞,直到有空間才存入;隊列空時阻塞,直到有數(shù)據(jù)才取出,多線程同步情況下能夠保持數(shù)據(jù)的一致性,隊列數(shù)據(jù)放在緩存中,存取效率高。

      其中,數(shù)據(jù)持久層,有本地數(shù)據(jù)和多個外圍數(shù)據(jù)庫組成。

      其中,操作系統(tǒng)可選的采用CentOS 7的64版本操作系統(tǒng)。

      下面結合附圖,對本發(fā)明實施例提供的數(shù)據(jù)庫數(shù)據(jù)讀寫裝置和方法進行說明。

      如圖2所示,本發(fā)明實施例提出一種數(shù)據(jù)庫數(shù)據(jù)讀寫裝置,設置在服務器上,所述數(shù)據(jù)庫數(shù)據(jù)讀寫裝置包括:

      讀取單元10,用于從應用服務器中讀取原始數(shù)據(jù),對所述原始數(shù)據(jù)進行封裝以得到目標數(shù)據(jù),并將所述目標數(shù)據(jù)存儲到緩存隊列中;

      提交單元20,用于根據(jù)預設的緩存讀取條件,將緩存隊列中緩存的目標數(shù)據(jù)存儲到數(shù)據(jù)庫中。

      其中,讀取單元10依次將目標數(shù)據(jù)存儲到緩存隊列的隊尾中,提交單元20從緩存隊列的隊首中依次取出數(shù)據(jù),并插入到數(shù)據(jù)庫中。

      首先對讀取單元10的工作過程進行說明。

      本發(fā)明實施例中,所述讀取單元10從應用服務器中讀取原始數(shù)據(jù)包括:

      從應用服務器中讀取條數(shù)為第一預定數(shù)目的原始數(shù)據(jù);

      在完成對第一預定數(shù)目的原始數(shù)據(jù)的封裝并得到對應的第一目標數(shù)據(jù),并且第一目標數(shù)據(jù)全部存儲到緩存隊列之后,再次從應用服務器中讀取條數(shù)為第一預定數(shù)目的原始數(shù)據(jù)。其中,第一目標數(shù)據(jù)為對一次讀取的原始數(shù)據(jù)封裝之后得到的目標數(shù)據(jù)。

      從應用服務器中讀取原始數(shù)據(jù)需要通過網(wǎng)絡請求完成,較為費時,因此,通過第一預定數(shù)目批量完成原始數(shù)據(jù)的讀取。

      例如,本次數(shù)據(jù)庫同步的全部原始數(shù)據(jù)為10000條,將第一預定數(shù)目設置為1000條,每次從應用服務器中讀取1000條原始數(shù)據(jù),共10次讀出全部原始數(shù)據(jù)。

      其中,第一預定數(shù)目設置為500~2000,例如,可以設置為1000條,第一預定數(shù)目是根據(jù)網(wǎng)絡流程以及系統(tǒng)緩存的大小所設置的。

      其中,在封裝好一條目標數(shù)據(jù)之后,將封裝的目標數(shù)據(jù)插入到緩存隊列的隊尾。

      其中,為了保證數(shù)據(jù)安全,不產(chǎn)生臟數(shù)據(jù),保存封裝的目標數(shù)據(jù)到緩存隊列的過程中,會涉及數(shù)據(jù)一致性問題,例如,在多線程環(huán)境下產(chǎn)生的數(shù)據(jù)同步問題,在多線程環(huán)境下,可能通過不同線程重復寫入同一條目標數(shù)據(jù),為了保證緩存隊列中目標數(shù)據(jù)的唯一性,讀取單元10需要在將封裝的目標數(shù)據(jù)存儲到緩存隊列之前,進行待寫入的目標數(shù)據(jù)的唯一性判斷。

      讀取單元10進行待寫入的目標數(shù)據(jù)的唯一性判斷包括:

      判斷待寫入的目標數(shù)據(jù)在數(shù)據(jù)庫中是否存在,如果在數(shù)據(jù)庫中不存在,則判斷待寫入的目標數(shù)據(jù)在緩存隊列中是否存在,如果在緩存隊列中不存在,則將待寫入的目標數(shù)據(jù)插入到緩存隊列。如果待寫入的目標數(shù)據(jù)在數(shù)據(jù)庫中存在,或待寫入的目標數(shù)據(jù)在緩存隊列中存在,則刪除該待寫入的目標數(shù)據(jù),判斷待寫入的目標數(shù)據(jù)是否存在的依據(jù)是每條目標數(shù)據(jù)中的唯一性Id。

      通過一致性判斷,在多線程同步情況下能夠保持數(shù)據(jù)的一致性,隊列數(shù)據(jù)放在緩存中,存取效率高。其中,緩存隊列為高速緩存隊列。

      下面對提交單元20的工作過程進行說明。

      本發(fā)明實施例中,所述提交單元20根據(jù)預設的緩存讀取條件,將緩存隊列中緩存的目標數(shù)據(jù)存儲到數(shù)據(jù)庫中包括:

      根據(jù)預定的讀取間隔,將緩存隊列中的目標數(shù)據(jù)批量存儲到數(shù)據(jù)庫中。

      其中,讀取間隔可以設置為5~20s,例如,可以設置為5s或者10s。

      其中,將緩存隊列中的目標數(shù)據(jù)批量存儲到數(shù)據(jù)庫中包括:

      根據(jù)預設的批量保存條數(shù)Nx,依次批量保存緩存隊列中的目標數(shù)據(jù),其中,每次保存的目標數(shù)據(jù)的最大數(shù)目為預設的批量保存條數(shù)Nx。

      本發(fā)明實施例中,所述提交單元20將緩存隊列中的目標數(shù)據(jù)批量存儲到數(shù)據(jù)庫中包括:

      預編譯存儲指令,每次向數(shù)據(jù)庫提交數(shù)據(jù)時,捆綁Ni條目標數(shù)據(jù)到存儲指令上,執(zhí)行存儲指令,以將Ni條目標數(shù)據(jù)存儲到數(shù)據(jù)庫中;其中,Ni為本次批量存儲需存儲數(shù)目。其中存儲指令可以是sql語句。

      本發(fā)明實施例中,所述提交單元20根據(jù)預定的讀取間隔,將緩存隊列中的目標數(shù)據(jù)存儲到數(shù)據(jù)庫中包括:

      根據(jù)預設的批量保存條數(shù)Nx,依次批量保存緩存隊列中的目標數(shù)據(jù);每次保存的目標數(shù)據(jù)的最大數(shù)目為預設的批量保存條數(shù)Nx;

      其中,

      獲取緩存隊列中存儲的數(shù)據(jù)的長度N1;

      若N1小于或等于0,結束本次存儲操作;

      若N1大于0且小于或等于Nx,將N1條數(shù)據(jù)以批量存儲的方式存儲到數(shù)據(jù)庫中;

      若N1大于Nx,分N_subs次將目標數(shù)目存儲到數(shù)據(jù)庫中,其中,在第1次至第N_subs-1次,將Nx條數(shù)據(jù)存儲到數(shù)據(jù)庫中,在第N_subs次時,將Nx條目標數(shù)據(jù)存儲到數(shù)據(jù)庫中;其中,N_subs等于N1除以Nx的整數(shù)商加1。

      本發(fā)明實施例提供的數(shù)據(jù)庫數(shù)據(jù)讀寫裝置至少具有如下技術效果:

      (1)將數(shù)據(jù)庫數(shù)據(jù)同步過程中的讀寫任務分離,讀取單元從外圍數(shù)據(jù)庫讀取數(shù)據(jù)并封裝后,沒有直接存儲到數(shù)據(jù)庫,而是寫到高速緩存隊列中,提交單元從隊列中取出數(shù)據(jù),按照給定步長,批量保存。從而提高并發(fā)效率。

      (2)使用原生jdbc API,相較于OM框架,減少對象映射以及多次sql執(zhí)行的開銷,執(zhí)行效率提高顯著。

      (3相關技術中,通常同步任務包括三個部分,第一、從外圍數(shù)據(jù)庫讀取,第二、逐條數(shù)據(jù)組裝,第三、在組裝數(shù)據(jù)之后逐條保存。經(jīng)過分解任務后,把第三步修改為暫時保存到緩存隊列中,由于高速緩存的寫入速度遠遠高于數(shù)據(jù)庫,因此讀取任務能大大提高效率;批量保存任務直接從緩存隊列中讀取數(shù)據(jù),這個過程效率比較高,只需要每段時間,比如每10秒,從緩存隊列取一次數(shù)據(jù)就能批量保存完隊列的所有數(shù)據(jù)。

      基于與上述實施例相同或相似的構思,本發(fā)明實施例還提供一種數(shù)據(jù)庫數(shù)據(jù)讀寫方法,參見圖3,為本發(fā)明實施例提供的數(shù)據(jù)庫數(shù)據(jù)讀寫方法的流程示意圖,如圖3所示,所述數(shù)據(jù)庫數(shù)據(jù)讀寫方法包括:

      步驟100,從應用服務器中讀取原始數(shù)據(jù),對所述原始數(shù)據(jù)進行封裝以得到目標數(shù)據(jù),并將所述目標數(shù)據(jù)存儲到緩存隊列中。

      如圖4所示,步驟100具體包括:

      步驟110,從應用服務器中讀取條數(shù)為第一預定數(shù)目的原始數(shù)據(jù);

      從應用服務器中讀取原始數(shù)據(jù)需要通過網(wǎng)絡請求完成,較為費時,因此,通過第一預定數(shù)目批量完成原始數(shù)據(jù)的讀取。

      例如,本次數(shù)據(jù)庫同步的全部原始數(shù)據(jù)為10000條,將第一預定數(shù)目設置為1000條,每次從應用服務器中讀取1000條原始數(shù)據(jù),共10次讀出全部原始數(shù)據(jù)。

      其中,第一預定數(shù)目設置為500~2000,例如,可以設置為1000條,第一預定數(shù)目是根據(jù)網(wǎng)絡流程以及系統(tǒng)緩存的大小所設置的。

      步驟120,根據(jù)讀取的原始數(shù)據(jù),基于業(yè)務數(shù)據(jù)模型對原始數(shù)據(jù)進行封裝,獲取封裝的目標數(shù)據(jù);

      根據(jù)不同的業(yè)務數(shù)據(jù)模型,封裝的目標數(shù)據(jù)的數(shù)目與第一預定數(shù)目相同或者不同。在對原始數(shù)據(jù)進行封裝時,需要遍歷全部讀取的原始數(shù)據(jù);

      步驟130,將封裝的目標數(shù)據(jù)存儲到緩存隊列。

      其中,在封裝好一條目標數(shù)據(jù)之后,將封裝的目標數(shù)據(jù)插入到緩存隊列的隊尾。

      其中,為了保證數(shù)據(jù)安全,不產(chǎn)生臟數(shù)據(jù),保存封裝的目標數(shù)據(jù)到緩存隊列的過程中,會涉及數(shù)據(jù)一致性問題,例如,在多線程環(huán)境下產(chǎn)生的數(shù)據(jù)同步問題,在多線程環(huán)境下,可能通過不同線程重復寫入同一條目標數(shù)據(jù),為了保證緩存隊列中目標數(shù)據(jù)的唯一性,需要在將封裝的目標數(shù)據(jù)存儲到緩存隊列之前,進行待寫入的目標數(shù)據(jù)的唯一性判斷。

      進行待寫入的目標數(shù)據(jù)的唯一性判斷包括:

      判斷待寫入的目標數(shù)據(jù)在數(shù)據(jù)庫中是否存在,如果在數(shù)據(jù)庫中不存在,則判斷待寫入的目標數(shù)據(jù)在緩存隊列中是否存在,如果在緩存隊列中不存在,則將待寫入的目標數(shù)據(jù)插入到緩存隊列。如果待寫入的目標數(shù)據(jù)在數(shù)據(jù)庫中存在,或待寫入的目標數(shù)據(jù)在緩存隊列中存在,則刪除該待寫入的目標數(shù)據(jù),判斷待寫入的目標數(shù)據(jù)是否存在的依據(jù)是每條目標數(shù)據(jù)中的唯一性Id。

      多線程同步情況下能夠保持數(shù)據(jù)的一致性,隊列數(shù)據(jù)放在緩存中,存取效率高。其中,緩存隊列為高速緩存隊列。

      步驟140,重復執(zhí)行步驟110~130,直至完成全部原始數(shù)據(jù)的讀取。

      在所述從應用服務器中讀取條數(shù)為第一預定數(shù)目的原始數(shù)據(jù)全部封裝完畢并得到對應的目標數(shù)據(jù),并且上述目標數(shù)據(jù)全部存儲到緩存隊列之后,執(zhí)行下一次的從應用服務器中讀取條數(shù)為第一預定數(shù)目的原始數(shù)據(jù)的步驟。

      當應用服務器中剩余待讀取數(shù)據(jù)不足第一預定數(shù)目時,讀取全部應用服務器中剩余待讀取數(shù)據(jù)。

      步驟200,根據(jù)預設的緩存讀取條件,將緩存隊列中緩存的目標數(shù)據(jù)存儲到數(shù)據(jù)庫中。

      步驟200具體包括:

      步驟210,根據(jù)預定的讀取間隔,將緩存隊列中的目標數(shù)據(jù)存儲到數(shù)據(jù)庫中。

      其中,讀取間隔可以設置為5~20s,例如,可以設置為5s或者10s。

      其中,將緩存隊列中的目標數(shù)據(jù)存儲到數(shù)據(jù)庫中包括:

      根據(jù)預設的批量保存條數(shù)Nx,依次批量保存緩存隊列中的目標數(shù)據(jù),其中,每次保存的目標數(shù)據(jù)的最大數(shù)目為預設的批量保存條數(shù)Nx。

      本發(fā)明實施例中,將緩存隊列中的目標數(shù)據(jù)批量存儲到數(shù)據(jù)庫中包括:

      預編譯一條sql語句,遍歷過程中捆綁本次批量存儲需存儲數(shù)目的目標數(shù)據(jù)到sql上,執(zhí)行上述一條sql語句,以將本次批量存儲需存儲數(shù)目的目標數(shù)據(jù)存儲到數(shù)據(jù)庫中。

      例如,批量保存條數(shù)Nx設置為100,如果緩存隊列中的目標數(shù)據(jù)共有360條,則分4次保存,第1次至第3次分別保存100條,第4次保存60條。

      具體地,示例性地,步驟210包括:

      步驟2101,獲取緩存隊列中存儲的數(shù)據(jù)的長度N1;

      步驟2102,若N1小于或等于0,結束本次存儲操作;

      步驟2103,若N1大于0且小于或等于Nx,將N1條數(shù)據(jù)以批量存儲的方式存儲到數(shù)據(jù)庫中;其中,將N1條數(shù)據(jù)存儲到數(shù)據(jù)庫中包括:預編譯一條sql語句,遍歷過程中將N1條數(shù)據(jù)捆綁到sql上,通過編譯的sql語句將N1條數(shù)據(jù)批量插入到數(shù)據(jù)庫中

      步驟2104,若N1大于Nx,分N_subs次將目標數(shù)目存儲到數(shù)據(jù)庫中,其中,在第1次至第N_subs-1次,將Nx條數(shù)據(jù)存儲到數(shù)據(jù)庫中,在第N_subs次時,將Nx條目標數(shù)據(jù)存儲到數(shù)據(jù)庫中;其中,N_subs=[N1/Nx]+1,其中,[]表示舍尾法取整。

      例如,若N1大于Nx,設置遍歷次數(shù)N_loops,提交數(shù)據(jù)庫次數(shù)設為N_subs,則N_loops=[N1/Nx],其中,[]表示舍尾法取整,N_subs=N_loops+1,遍歷前首先預編譯一條sql語句,遍歷過程中每次捆綁Nx條數(shù)據(jù)到sql上,然后批量插入到數(shù)據(jù)庫中,知道完成N_loops次遍歷,此時已經(jīng)完成N_loops次提交數(shù)據(jù)庫,還有一次提交數(shù)據(jù)庫是綁定N1%Nx條數(shù)據(jù)到sql上;其中,N1%Nx為N1除以Nx得到的余數(shù)。

      步驟220,重復步驟210直至完成全部原始數(shù)據(jù)的讀寫操作。

      本發(fā)明實施例中,步驟100和步驟200可以并行運行。

      下面結合一個具體的示例進行說明。

      表1應用Jdbc技術寫入數(shù)據(jù)庫與之前的Hibernate單條插入的對比

      表1中,修改前為現(xiàn)有技術的Hibernate單條插入技術實施的數(shù)據(jù)庫間的數(shù)據(jù)同步,修改后為本發(fā)明實施例提供的數(shù)據(jù)讀寫方法進行數(shù)據(jù)庫間的數(shù)據(jù)同步,其中,本示例中只選取1~10000的每個階段數(shù)據(jù)進行測試,從上面測試結果,可以看出,采用本發(fā)明實施例提供的數(shù)據(jù)讀寫方法分解任務后,效率提升明顯,大約提升30%,在實際任務能節(jié)約三分之一的時間,加快了項目進度。

      其中,實驗測試環(huán)境如下:

      處理器:Intel(R)Pentinum(R)CPU G3250@3.20GHz 3.20GHz

      安裝內(nèi)存:4GB

      系統(tǒng)類型:64位

      系統(tǒng)版本:Windows 7旗艦版

      Hibernate批量數(shù)據(jù)存儲包括:從應用服務器中讀取數(shù)據(jù);遍歷每條數(shù)據(jù),根據(jù)業(yè)務需要封裝成業(yè)務數(shù)據(jù)模型;將封裝好的數(shù)據(jù)存入到Hibernate的緩存中,當Hibernate緩存提交達到預定數(shù)目后,Hibernate將預定數(shù)目的數(shù)據(jù)對象提交到數(shù)據(jù)庫,例如,預定數(shù)目為100時,當Hibernate緩存提交達到100后,數(shù)據(jù)庫執(zhí)行100次這100條數(shù)據(jù)的插入。

      Hibernate緩存是Hibernate框架捆綁的,是為操作數(shù)據(jù)庫服務的,用于操作sql的中間數(shù)據(jù),不是直接用于存儲業(yè)務的中間數(shù)據(jù),本發(fā)明實施例中,從應用服務器讀取的原始數(shù)據(jù),以及根據(jù)原始數(shù)據(jù)封裝得到的目標數(shù)據(jù)都屬于中間數(shù)據(jù),并非操作sql的中間數(shù)據(jù),無法利用Hibernate緩存進行緩存,本實施例中,通過數(shù)據(jù)庫數(shù)據(jù)讀寫裝置創(chuàng)建緩存隊列,并利用緩存隊列存儲目標數(shù)據(jù),此外,本發(fā)明實施例中,可以根據(jù)寫任務決定緩存隊列中緩存的數(shù)據(jù)的生命周期,按照特定的緩存讀取間隔(或緩存讀取頻率)來將緩存隊列中的數(shù)據(jù)提交到數(shù)據(jù)庫,能夠通過上述間隔或頻率的調(diào)整做好讀任務和寫任務之間的平衡,使得數(shù)據(jù)庫數(shù)據(jù)讀寫達到性能最優(yōu)。

      此外,Hibernate的一次批量提交雖然也是一次操作數(shù)據(jù)庫,但是提交數(shù)據(jù)跟Jdbc批量插入有本質上的區(qū)別,具體以下兩點,第一,Hibernate需要為每條數(shù)據(jù)映射成sql語句;例如,在存儲100條數(shù)據(jù)時,需要為每一條數(shù)據(jù)編譯一次sql語句,也就是要編譯100次sql語句,第二,Hibernate批量插入實際上是執(zhí)行每條sql語句,不是真正的批量提交;本發(fā)明實施例中,采用Jdbc批量提交進行存儲,其中,首先預編譯一條sql語句在內(nèi)存中,然后向sql捆綁給定條數(shù)目的數(shù)據(jù),再一次提交到數(shù)據(jù)庫,因此,通過使用Jdbc批量插入,提高了數(shù)據(jù)存儲的速度。

      本發(fā)明實施例中,還包括從多個服務器讀取原始數(shù)據(jù)并提交到數(shù)據(jù)庫的場景,以從2個服務器讀取原始數(shù)據(jù)為例,該應用環(huán)境下,包括:

      分別從兩個服務器中讀取原始數(shù)據(jù);根據(jù)兩個服務器中的數(shù)據(jù)關系確定各個服務器中讀取原始數(shù)據(jù)的條數(shù);

      根據(jù)兩個服務器中讀取原始數(shù)據(jù)封裝得到目標數(shù)據(jù);

      將封裝得到目標數(shù)據(jù)插入到緩存隊列;

      根據(jù)預設的緩存讀取條件,將緩存隊列中緩存的目標數(shù)據(jù)存儲到數(shù)據(jù)庫中。該應用場景中,雖然是從2個服務器讀取原始數(shù)據(jù),但是同樣只需要建立一個緩存隊列,用于緩存待提交到數(shù)據(jù)庫的封裝好的目標數(shù)據(jù)。

      需要說明的是,在本文中,術語“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過程、方法、物品或者裝置不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過程、方法、物品或者裝置所固有的要素。在沒有更多限制的情況下,由語句“包括一個......”限定的要素,并不排除在包括該要素的過程、方法、物品或者裝置中還存在另外的相同要素。

      上述本發(fā)明實施例序號僅僅為了描述,不代表實施例的優(yōu)劣。

      通過以上的實施方式的描述,本領域的技術人員可以清楚地了解到上述實施例方法可借助軟件加必需的通用硬件平臺的方式來實現(xiàn),當然也可以通過硬件,但很多情況下前者是更佳的實施方式?;谶@樣的理解,本發(fā)明的技術方案本質上或者說對現(xiàn)有技術做出貢獻的部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該計算機軟件產(chǎn)品存儲在一個存儲介質(如ROM/RAM、磁碟、光盤)中,包括若干指令用以使得一臺終端設備(可以是手機,計算機,服務器,空調(diào)器,或者網(wǎng)絡設備等)執(zhí)行本發(fā)明各個實施例所述的方法。

      以上僅為本發(fā)明的優(yōu)選實施例,并非因此限制本發(fā)明的專利范圍,凡是利用本發(fā)明說明書及附圖內(nèi)容所作的等效結構或等效流程變換,或直接或間接運用在其他相關的技術領域,均同理包括在本發(fā)明的專利保護范圍內(nèi)。

      當前第1頁1 2 3 
      網(wǎng)友詢問留言 已有0條留言
      • 還沒有人留言評論。精彩留言會獲得點贊!
      1