天天看點

批量資料資料庫操作

資料庫優化法則歸納為5個層次:

1、 減少資料通路(減少磁盤通路)

2、 傳回更少資料(減少網絡傳輸或磁盤通路)

3、 減少互動次數(減少網絡傳輸)

4、 減少伺服器CPU開銷(減少CPU及記憶體開銷)

5、 利用更多資源(增加資源)

資料批量處理一般有兩種情況(針對減少磁盤通路):

1、資料從一個資料庫表A遷移到另一個資料庫表B,這種情況可以每次取一定數量(例如:5條)進行批量插入。

語句如下:

在insert中寫多個value

INSERT INTO table(field1,field2,field3)VALUES(‘a’,’b’,’c’),(‘a’,’b’,’c’),(‘a’,’b’,’c’),(‘a’,’b’,’c’),(‘a’,’b’,’c’);

2、資料是實時資料,比如伺服器接收到的資料,資料可能在短時間有大量資料上傳,也可能長時間沒有,資料上傳太快對與伺服器的互動性能有較大的要求,如果可以批量插入,減少通路資料庫,一次存入較多的資料,來提高伺服器性能;

可以用vector或者其他合适的資料結構來臨時存儲資料,當達到預定設定的門檻值時進行一次資料處理,比如vector.size>=5;

實作如下:

#include
typedef struct BIGINSERT
{
int strBooknumber;
CString strLocation;
}_biginsert_info;
typedef std::vector<_biginsert_info> Vecbigdatainsert;
_batch_info bigdatainsert;
Vecbigdatainsert vectordata;
Bigdatainsert.strBooknumber = //上傳的資料
Bigdatainsert.strLocation = //上傳的資料
//存入容器中
vectordata.push_back(Bigdatainsert);
int itSize = vectordata.size();
if(itSize >= 5)
{
int j = 0;
CString str1;
str1.Format("%s","(’%d’,’%s’)");
CString cstrdata[100];
CString strTemp = “”;
for(Vecbigdatainsert::iterator it = vectordata.begin();it !=vectordata.end();
it++)
1
{
 cstrdata[j].Format("('%d','%s')",it->strBooknumber,it->strLocation);
 CString csData = cstrdata[j];
 if(j == itSize-1)
{
   strinsert+= csData;
   break;
  }
 else
  {
    strinsert+=  csData;
    strinsert+=",";
     j++;
  }
}
//釋放
vectordata.swap(vector<_biginsert_info>());
INSERT INTO table (field1,field2) VALUES %s",strinsert);      

存在的問題是當資料上傳比較緩慢的時候,沒有達到門檻值,資料不會處理,目前想到的解決辦法是加一個線程進行定時處理,在規定的時間内,小于門檻值的時候也進行處理,規定時間t是多少,根據時間資料要求的及時性設定;大家有什麼好的想法進行交流,不勝感激!!

公衆号:cjj_cxy