批量數據數據庫操作

數據庫優化法則歸納爲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++)

{

 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章