【翠字营原创】 应用程序在读写SQLite数据是否需要自己加锁保障?

来源:互联网 发布:java 18.3 编辑:程序博客网 时间:2024/05/16 18:33

 

大致意图:启动两个线程并发执行insert 一张表, 看看是否存在插入失败的情况,

最终测试结果SQLLite 自己内部有保护, 应用程序可以不要再加锁保护,但是应用层需要保护自己的临界资源,

比如键值信息, 可以根据下面的程序演变其他的测试项, 包括对SQLLite 操性能的考察。

#include<...>

 

class Task_test : public ACE_Task <ACE_MT_SYNCH>
{
public:
 Task_test(): m_pdb(NULL), m_nUnique(0)
 {
 }

 

 ~Task_test()
 {
  sqlite3_close(m_pdb);  //关闭sqllite 对象
 }

 

 virtual int svc()
 {

  int nThreadID = ACE_OS::thr_self();  //获取当前线程ID
  char *perrmsg = NULL;

 

  for (int i=0; i<10; i++)
  {
   char szch[50]={0};
   ACE_OS::snprintf(szch, 99, "insert into tbl_test values (%d, %d, 'xcp')", getunique(), nThreadID);

   //执行插入操作
   int nResult = sqlite3_exec(m_pdb, szch, 0, 0, &perrmsg);
   if(nResult != SQLITE_OK )
   {
    ACE_DEBUG((LM_INFO, "%T <%t> insert failed. /n"));
   }
   else
   {
    ACE_DEBUG((LM_INFO, "%T <%t> insert success. /n"));
   }
  }

  return 0;
 }

 

 

 

 void init()
 {
  int nResult = 0;
  char *perrmsg = NULL;

  //打开db,创建sqllite 对象

  nResult = sqlite3_open("./db/test.db", &m_pdb);
  if( nResult != SQLITE_OK )
  {
   ACE_DEBUG((LM_INFO, "%T <%t> open db failed. /n"));
   return;
  }
  else
  {
   ACE_DEBUG((LM_INFO, "%T <%t> open db success. /n"));
  }

 

 //创建数据表

  nResult = sqlite3_exec(m_pdb, "create table tbl_test (id integer primary key, threadID integer, name varchar(32))", 0, 0, &perrmsg);
  if(nResult != SQLITE_OK )
  {
   ACE_DEBUG((LM_INFO, "%T <%t> create table failed. /n"));
   return;
  }
  else
  {
   ACE_DEBUG((LM_INFO, "%T <%t> create db success. /n"));
  }
 }

 

 

//显示数据表信息

 void display()
 {
  int nResult = 0;
  char *perrmsg = NULL;

  int nRow = 0;
  int nCol = 0;
  char **ppResult = NULL;
  nResult = sqlite3_get_table(m_pdb, "select * from tbl_test", &ppResult, &nRow, &nCol, &perrmsg);
  if(nResult != SQLITE_OK )
  {
   std::cout<<"exec sql failed."<<std::endl;
  }
  
  for(int k=0; k<=nRow; k++)
  {
   std::cout<<k<<": ";
   
   int t=0;
   while (t < nCol)
   {  
    
    std::cout<<ppResult[k*nCol+t]<<"/t";
    t++;
   }
   std::cout<<std::endl<<"------------------------------------"<<std::endl;
  }
  
  sqlite3_free_table(ppResult);  //释放结果信息

 }

protected:
private:


 sqlite3 *m_pdb;
 ACE_Recursive_Thread_Mutex m_lock;
 int m_nUnique;

 

 int getunique()
 {
  ACE_Guard<ACE_Recursive_Thread_Mutex> guard(m_lock);
  return ++m_nUnique;
 }


};

 

//主程序
int main(int argc, char* argv[])
{
 Task_test oTask_test;
 oTask_test.init();
 oTask_test.activate((THR_NEW_LWP | THR_JOINABLE), 2);
 oTask_test.wait();
 oTask_test.display();

 

 return 0;

}

 

------------------------------------------

输出如下:

 17:03:56.839000 <2836> open db success.
 17:03:56.999000 <2836> create db success.
 17:03:59.112000 <2828> insert success.
 17:03:59.212000 <4020> insert success.
 17:03:59.333000 <2828> insert success.
 17:03:59.433000 <4020> insert success.
 17:03:59.533000 <2828> insert success.
 17:03:59.643000 <4020> insert success.
 17:03:59.743000 <2828> insert success.
 17:03:59.843000 <4020> insert success.
 17:03:59.943000 <2828> insert success.
 17:04:00.044000 <4020> insert success.
 17:04:00.144000 <2828> insert success.
 17:04:00.254000 <4020> insert success.
 17:04:00.374000 <2828> insert success.
 17:04:00.474000 <4020> insert success.
 17:04:00.584000 <2828> insert success.
 17:04:00.695000 <4020> insert success.
 17:04:00.795000 <2828> insert success.
 17:04:00.895000 <4020> insert success.
 17:04:01.015000 <2828> insert success.
 17:04:01.125000 <4020> insert success.


0: id   threadID        name
------------------------------------
1: 1    2828    xcp
------------------------------------
2: 2    4020    xcp
------------------------------------
3: 3    2828    xcp
------------------------------------
4: 4    4020    xcp
------------------------------------
5: 5    2828    xcp
------------------------------------
6: 6    4020    xcp
------------------------------------
7: 7    2828    xcp
------------------------------------
8: 8    4020    xcp
------------------------------------
9: 9    2828    xcp
------------------------------------
10: 10  4020    xcp
------------------------------------
11: 11  2828    xcp
------------------------------------
12: 12  4020    xcp
------------------------------------
13: 13  2828    xcp
------------------------------------
14: 14  4020    xcp
------------------------------------
15: 15  2828    xcp
------------------------------------
16: 16  4020    xcp
------------------------------------
17: 17  2828    xcp
------------------------------------
18: 18  4020    xcp
------------------------------------
19: 19  2828    xcp
------------------------------------
20: 20  4020    xcp
------------------------------------

原创粉丝点击