一種動態(tài)調(diào)整內(nèi)存空間批量存儲數(shù)據(jù)的方法【專利摘要】本發(fā)明一種動態(tài)調(diào)整內(nèi)存空間批量存儲數(shù)據(jù)的方法,當向數(shù)據(jù)庫批量插入數(shù)據(jù)時,利用數(shù)據(jù)庫內(nèi)存表的讀寫速度比實體表的速度快的特點,把數(shù)據(jù)先存到內(nèi)存表,保證數(shù)據(jù)能及時存入數(shù)據(jù)庫,再把數(shù)據(jù)從內(nèi)存表寫入實體表內(nèi),以便把數(shù)據(jù)更及時快速地保存起來,其中內(nèi)存表與實體表的對應(yīng)關(guān)系設(shè)置成n:1,為了控制內(nèi)存表所占用的內(nèi)存空間,需要控制內(nèi)存表的存儲數(shù)據(jù)的行數(shù)跟內(nèi)存表的個數(shù),間接地調(diào)整了內(nèi)存的空間。【專利說明】—種動態(tài)調(diào)整內(nèi)存空間批量存儲數(shù)據(jù)的方法【
技術(shù)領(lǐng)域:
】[0001]本發(fā)明涉及一種動態(tài)調(diào)整內(nèi)存空間批量存儲數(shù)據(jù)的方法。技術(shù)背景[0002]當向數(shù)據(jù)庫存儲的數(shù)據(jù)量大且頻繁時,數(shù)據(jù)庫的性能會受到嚴重的考驗,導(dǎo)致插入數(shù)據(jù)的速度下降,甚至出現(xiàn)表死鎖、內(nèi)存耗盡、數(shù)據(jù)庫崩潰的現(xiàn)象。為此,通常會根據(jù)數(shù)據(jù)庫性能參數(shù)值,增加設(shè)置內(nèi)存表的數(shù)量,以減少表死鎖的概率,但內(nèi)存表的數(shù)量已被固定,若數(shù)量設(shè)置少了,批量插入大量的數(shù)據(jù)時將導(dǎo)致性能受限,若數(shù)量設(shè)置多了,當批量插入數(shù)據(jù)的量小時,浪費了內(nèi)存空間,延長了數(shù)據(jù)保存到實體表中?!?br/>發(fā)明內(nèi)容】[0003]本發(fā)明的目的在于提供一種動態(tài)調(diào)整內(nèi)存空間批量存儲數(shù)據(jù)的方法,讓數(shù)據(jù)能更及時、更快的存入到數(shù)據(jù)庫中。[0004]一種動態(tài)調(diào)整內(nèi)存空間批量存儲數(shù)據(jù)的方法,包括如下步驟:步驟1、將內(nèi)存表的狀態(tài)設(shè)定分成“未把數(shù)據(jù)轉(zhuǎn)出到實體表的狀態(tài)”和“把數(shù)據(jù)轉(zhuǎn)出到實體表的狀態(tài)”兩種狀態(tài);步驟2、初始化內(nèi)存表個數(shù)和內(nèi)存表允許保存的最大行數(shù);步驟3、判斷當前內(nèi)存表的個數(shù)num與上一次初始化的內(nèi)存表個數(shù)per_num的大小,如果小于上一次初始化的內(nèi)存表個數(shù)per_num,先把未用到的第num+1到第per_num個內(nèi)存表中的數(shù)據(jù)轉(zhuǎn)存到實體表中,丟棄第num+1到per_num個內(nèi)存表,釋放內(nèi)存空間,如果大于上一次初始化的內(nèi)存表個數(shù)per_num,則創(chuàng)建per_num+l到num的內(nèi)存表;步驟4、生成一個(O?9)之間的隨機整數(shù)N,判斷第N個內(nèi)存表是否處于“把數(shù)據(jù)轉(zhuǎn)出到實體表的狀態(tài)”,如果是,則再重新隨機生成一個(O?9)之間的隨機數(shù)N,直到第N個內(nèi)存表處于“未把數(shù)據(jù)轉(zhuǎn)出到實體表的狀態(tài)”,把數(shù)據(jù)插入該第N個內(nèi)存表中,并把插入數(shù)據(jù)行數(shù)insert_row記錄到數(shù)據(jù)庫的每次插入行數(shù)的記錄表Table_Batch_Rows中;步驟5、記錄每次插入表的數(shù)據(jù)行數(shù)insert_row、插入時間insert_time,并將所述數(shù)據(jù)保存到每次插入行數(shù)的記錄表Table_Batch_R0WS中,間隔預(yù)置時間T從插入行數(shù)的記錄表Table_Batch_Rows計算出最近的時間T內(nèi)每個時間段內(nèi)平均插入的數(shù)據(jù),作為內(nèi)存表允許保存的最大行數(shù)的值,當插入數(shù)據(jù)的速度低于閾值時,可手動調(diào)整內(nèi)存表個數(shù);步驟6、判斷此時的第N個內(nèi)存表的行數(shù)是否達到內(nèi)存表允許保存最大行數(shù),如果達至IJ,設(shè)置該第N個內(nèi)存表的狀態(tài)處于“把數(shù)據(jù)轉(zhuǎn)出到實體表的狀態(tài)”,并把該第N個內(nèi)存表的數(shù)據(jù)轉(zhuǎn)存到實體表中,然后清空內(nèi)存表,設(shè)置該第N個內(nèi)存表的狀態(tài)處于“未把數(shù)據(jù)轉(zhuǎn)出到實體表的狀態(tài)”;如果未達到內(nèi)存表允許保存的最大行數(shù),則進行下一次批量存儲操作,返回步驟4。[0005]本發(fā)明一種動態(tài)調(diào)整內(nèi)存空間批量存儲數(shù)據(jù)的方法,當向數(shù)據(jù)庫批量插入數(shù)據(jù)時,利用數(shù)據(jù)庫內(nèi)存表的讀寫速度比實體表的速度快的特點,把數(shù)據(jù)先存到內(nèi)存表,保證數(shù)據(jù)能及時存入數(shù)據(jù)庫,再把數(shù)據(jù)從內(nèi)存表寫入實體表內(nèi),以便把數(shù)據(jù)更及時快速地保存起來,其中內(nèi)存表與實體表的對應(yīng)關(guān)系設(shè)置成η:1,為了控制內(nèi)存表所占用的內(nèi)存空間,需要控制內(nèi)存表的存儲數(shù)據(jù)的行數(shù)跟內(nèi)存表的個數(shù),間接地調(diào)整了內(nèi)存的空間?!揪唧w實施方式】[0006]本發(fā)明一種動態(tài)調(diào)整內(nèi)存空間批量存儲數(shù)據(jù)的方法,具體包括如下步驟:步驟1、將內(nèi)存表的狀態(tài)設(shè)定分成“未把數(shù)據(jù)轉(zhuǎn)出到實體表的狀態(tài)”和“把數(shù)據(jù)轉(zhuǎn)出到實體表的狀態(tài)”兩種狀態(tài);步驟2、初始化內(nèi)存表個數(shù)和內(nèi)存表允許保存的最大行數(shù);初始化內(nèi)存表個數(shù)table_num為2,設(shè)定內(nèi)存表編號為table_num_0到table_num_3;初始化設(shè)定內(nèi)存表允許保存的最大行數(shù)row_num為50;步驟3、判斷當前內(nèi)存表的個數(shù)num與上一次初始化的內(nèi)存表個數(shù)per_num的大小,如果小于上一次初始化的內(nèi)存表個數(shù)per_num,先把未用到的第num+1到第per_num個內(nèi)存表中的數(shù)據(jù)轉(zhuǎn)存到實體表中,丟棄第num+1到per_num個內(nèi)存表,釋放內(nèi)存空間,如果大于上一次初始化的內(nèi)存表個數(shù)per_num,則創(chuàng)建per_num+l到num的內(nèi)存表;步驟4、生成一個(O?9)之間的隨機整數(shù)N,判斷第N個內(nèi)存表是否處于“把數(shù)據(jù)轉(zhuǎn)出到實體表的狀態(tài)”,如果是,則再重新隨機生成一個(O?9)之間的隨機數(shù)N,直到第N個內(nèi)存表處于“未把數(shù)據(jù)轉(zhuǎn)出到實體表的狀態(tài)”,把數(shù)據(jù)插入該第N個內(nèi)存表中,這樣做的目的是防止表在在刪除操作時,同時進行插入操作,導(dǎo)致死鎖;并把插入數(shù)據(jù)行數(shù)inSert_r0W記錄到數(shù)據(jù)庫的每次插入行數(shù)的記錄表Table_Batch_Rows中;步驟5、為了能讓內(nèi)存表允許保存的最大行數(shù)能自動調(diào)整,可通過步驟4記錄每次插入表的數(shù)據(jù)行數(shù)insert_row,插入時間insert_time,并將所述數(shù)據(jù)保存到每次插入行數(shù)的記錄表Table_Batch_Rows中,設(shè)定定時器每一小時(時間可預(yù)置)從插入行數(shù)的記錄表Table_Batch_Rows計算出最近一小時每10分鐘內(nèi)平均插入的數(shù)據(jù),作為內(nèi)存表允許保存的最大行數(shù)row_num的值,能自動調(diào)整內(nèi)存表允許保存的最大行數(shù)row_num,從而間接自動地調(diào)整了內(nèi)存表的大小。當插入的數(shù)據(jù)變慢時,可手動調(diào)整內(nèi)存表個數(shù),內(nèi)存表個數(shù)table_num范圍為I到10,內(nèi)存表個數(shù)太大會影響數(shù)據(jù)存到實體表的速度,也會占用太多已經(jīng)分配給數(shù)據(jù)庫的內(nèi)存,這個值要根據(jù)具體環(huán)境測出最優(yōu)值;步驟6、判斷此時的第N個內(nèi)存表的行數(shù)是否達到內(nèi)存表允許保存最大行數(shù),如果達至IJ,設(shè)置該第N個內(nèi)存表的狀態(tài)處于“把數(shù)據(jù)轉(zhuǎn)出到實體表的狀態(tài)”,并把該第N個內(nèi)存表的數(shù)據(jù)轉(zhuǎn)存到實體表中,然后清空內(nèi)存表,設(shè)置該第N個內(nèi)存表的狀態(tài)處于“未把數(shù)據(jù)轉(zhuǎn)出到實體表的狀態(tài)”;如果未達到內(nèi)存表允許保存的最大行數(shù),則進行下一次批量存儲操作,返回步驟4。[0007]以上所述,僅是本發(fā)明較佳實施例而已,并非對本發(fā)明的技術(shù)范圍作任何限制,故凡是依據(jù)本發(fā)明的技術(shù)實質(zhì)對以上實施例所作的任何細微修改、等同變化與修飾,均仍屬于本發(fā)明技術(shù)方案的范圍內(nèi)。【權(quán)利要求】1.一種動態(tài)調(diào)整內(nèi)存空間批量存儲數(shù)據(jù)的方法,其特征在于包括如下步驟:步驟1、將內(nèi)存表的狀態(tài)設(shè)定分成“未把數(shù)據(jù)轉(zhuǎn)出到實體表的狀態(tài)”和“把數(shù)據(jù)轉(zhuǎn)出到實體表的狀態(tài)”兩種狀態(tài);步驟2、初始化內(nèi)存表個數(shù)和內(nèi)存表允許保存的最大行數(shù);步驟3、判斷當前內(nèi)存表的個數(shù)num與上一次初始化的內(nèi)存表個數(shù)per_num的大小,如果小于上一次初始化的內(nèi)存表個數(shù)per_num,先把未用到的第num+1到第per_num個內(nèi)存表中的數(shù)據(jù)轉(zhuǎn)存到實體表中,丟棄第num+1到per_num個內(nèi)存表,釋放內(nèi)存空間,如果大于上一次初始化的內(nèi)存表個數(shù)per_num,則創(chuàng)建per_num+l到num的內(nèi)存表;步驟4、生成一個(O?9)之間的隨機整數(shù)N,判斷第N個內(nèi)存表是否處于“把數(shù)據(jù)轉(zhuǎn)出到實體表的狀態(tài)”,如果是,則再重新隨機生成一個(O?9)之間的隨機數(shù)N,直到第N個內(nèi)存表處于“未把數(shù)據(jù)轉(zhuǎn)出到實體表的狀態(tài)”,把數(shù)據(jù)插入該第N個內(nèi)存表中,并把插入數(shù)據(jù)行數(shù)insert_row記錄到數(shù)據(jù)庫的每次插入行數(shù)的記錄表Table_Batch_Rows中;步驟5、記錄每次插入表的數(shù)據(jù)行數(shù)insert_row、插入時間insert_time,并將所述數(shù)據(jù)保存到每次插入行數(shù)的記錄表Table_Batch_R0WS中,間隔預(yù)置時間T從插入行數(shù)的記錄表Table_Batch_Rows計算出最近的時間T內(nèi)每個時間段內(nèi)平均插入的數(shù)據(jù),作為內(nèi)存表允許保存的最大行數(shù)的值,當插入數(shù)據(jù)的速度低于閾值時,可手動調(diào)整內(nèi)存表個數(shù);步驟6、判斷此時的第N個內(nèi)存表的行數(shù)是否達到內(nèi)存表允許保存最大行數(shù),如果達至IJ,設(shè)置該第N個內(nèi)存表的狀態(tài)處于“把數(shù)據(jù)轉(zhuǎn)出到實體表的狀態(tài)”,并把該第N個內(nèi)存表的數(shù)據(jù)轉(zhuǎn)存到實體表中,然后清空內(nèi)存表,設(shè)置該第N個內(nèi)存表的狀態(tài)處于“未把數(shù)據(jù)轉(zhuǎn)出到實體表的狀態(tài)”;如果未達到內(nèi)存表允許保存的最大行數(shù),則進行下一次批量存儲操作,返回步驟4?!疚臋n編號】G06F17/30GK103870483SQ201210538286【公開日】2014年6月18日申請日期:2012年12月13日優(yōu)先權(quán)日:2012年12月13日【發(fā)明者】詹友陸,傅建記,余建成,張嶼申請人:廈門雅迅網(wǎng)絡(luò)股份有限公司