【原创】sqlite线程安全实验【chad20130201】
发布时间:2020-12-12 19:44:22 所属栏目:百科 来源:网络整理
导读:【原创】sqlite线程安全实验【chad20130201】 编译sqlite时使用默认配置,启用了线程安全设置。 实验程序如下: int Query_db( char * db_file_name ){ printf ( "in %sn" ,__FUNCTION__); int ret; sqlite3_stmt *pstmt = NULL; char *errMsg = NULL; char
【原创】sqlite线程安全实验【chad20130201】编译sqlite时使用默认配置,启用了线程安全设置。 实验程序如下: int Query_db( char* db_file_name )
{
printf("in %sn",__FUNCTION__);
int ret;
sqlite3_stmt *pstmt = NULL;
char *errMsg = NULL;
char *sql = "SELECT * FROM MonthFreezeTable WHERE id<500;";//查询表中有多少列
int id;
STRUCT_TEST1 test_struct1;
STRUCT_TEST2 test_struct2;
memset(&test_struct1,0,sizeof(test_struct1));
memset(&test_struct2,sizeof(test_struct2));
ret = sqlite3_prepare(pdb,sql,strlen(sql),&pstmt,&errMsg);
if( ret != SQLITE_OK )
{
printf("error code :%d,reason:%sn",ret,errMsg);
sqlite3_free( errMsg );
return -1;
}/*这一部分程序有问题*/
while( 1 )
{
ret = sqlite3_step(pstmt);
if( ret != SQLITE_ROW )
{ break; }
id = sqlite3_column_int(pstmt,0);
printf("id = %d ",id);
usleep(10000);
}
sqlite3_finalize( pstmt ); //把刚才分配的内容析构掉
sqlite3_reset( pstmt );
return 0;
}
int UpdateBlobData(char *db_file_name)
{
printf("in %sn",__FUNCTION__);
int ret;
sqlite3_stmt *pstmt = NULL;
char *errMsg = NULL;
char sql[1023];// = "UPDATE MonthFreezeTable SET TimeScale=datetime(),ForwardPowerInd=:forw WHERE id>0;";
int index1,index2;
char *timebuf="2010-11-11";
clock_t starttime,endtime;
double totaltime;
starttime = clock();
printf("start update the db n");
int i ;
for(i=0;i<441;i++){
printf("%10d",i);
//timebuf = Now();
//printf("Now:%s",timebuf);
sprintf(sql,"UPDATE MonthFreezeTable SET TimeScale=datetime(),ForwardPowerInd=:forw WHERE id=%d;",i);
ret = sqlite3_prepare(pdb,&errMsg);//预编译
if( ret != SQLITE_OK )
{
printf("error code :%d,errMsg);
sqlite3_free( errMsg );
return -1;
}
index2 = sqlite3_bind_parameter_index( pstmt,":forw" );//生成索引
ret = sqlite3_bind_blob(pstmt,index2,10,SQLITE_STATIC);//绑定数据流
if( ret != SQLITE_OK )
{
printf("the sqlite3_bind_blob error!n");
printf("error code :%d n",ret);
return -1;
}
restep:
sqlite3_busy_timeout(pdb,1000);
ret = sqlite3_step(pstmt);//执行
if( ret != SQLITE_DONE )
{
if( ret == SQLITE_BUSY ){//SQLITE_BUSY
printf("step timeout!n");
goto restep;
}
printf("the sqlite3_step error!n");
printf("error code :%d n",ret);
return -1;
}
}
printf("end update the db n");
endtime = clock();
totaltime = (double)( (endtime - starttime)/(double)CLOCKS_PER_SEC );
printf("the total time = %f sn",totaltime);
printf("the step time = %f msn",(totaltime*1000)/(12*2041));
sqlite3_finalize( pstmt ); //把刚才分配的内容析构掉
sqlite3_reset( pstmt );
return 0;
}
实验1:两个线程(进程同时进行数据查询操作!) int main(void)
{
int ret;
ret = Create_db( "/home/terminal.db" );
if(ret < 0)
{
return -1;
}
int pid = fork();
if(pid < 0) {
perror("fork error!n");
return 0;
}
if(pid==0){
printf("the child pross!n");
ret = Query_db( "/home/terminal.db" );
if(ret < 0)
{
return -1;
}
printf("child sleep 5!n");
sleep(5);
}else{
printf("the father pross!n");
ret = Query_db( "/home/terminal.db" );
if(ret < 0)
{
return -1;
}
sleep(5);
printf("father sleep 5!n");
}
sqlite3_close(pdb);
return 0;
}
打印结果如下所示:(示例) int pid = fork();
if(pid < 0) {
perror("fork error!n");
return 0;
}
if(pid==0){
printf("the child pross!n");
ret = UpdateBlobData( "/home/terminal.db" );
if(ret < 0)
{
return -1;
}
printf("child sleep 5!n");
sleep(5);
}else{
printf("the father pross!n");
ret = Query_db( "/home/terminal.db" );
if(ret < 0)
{
return -1;
}
sleep(5);
printf("father sleep 5!n");
}
执行结果如下: 由于SQLite仅仅提供了粒度很粗的数据锁,如读写锁,因此在每次加锁操作中都会有大量的数据被锁住,即使仅有极小部分的数据会被访问。换句话说,我们可以认为SQLite只是提供了表级锁,没有提供行级锁。在这种同步机制下,并发性能很难高效。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |