基于C API的MySQL数据库多线程访问方法

来源 :电脑知识与技术 | 被引量 : 0次 | 上传用户:fgjfg111
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  摘要:目前,数据库在各行各业中广泛应用。在众多商业数据库软件中,SQL SERVER 和ORACLE被较多的使用,因此这两个数据库软件的价格也较昂贵。本文主要介绍MySQL数据库在单线程或多线程程序环境下使用C API访问MySQL数据库方法,并给出了相应代码和分析。该数据库属于开源数据库,具有较高的成熟度,并且对于社区版本可以免费使用,因此对于需要使用C API访问数据库的项目开发,可降低开发成本。
  关键词:MySQL;C API;多线程
  中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)16-30904-02
  Based on C API MySQL Database Multi-threaded Access Methods
  YU Cheng-gong
  (Zhejiang Pharmaceutical College,Ningbo 315100,China)
  Abstract:Currently,the database in all walks of life were widely used.In many commercial database software,SQL Server and Oracle are used more and therefore their prices are more expensive. This paper describes the MySQL database in single-threaded or multi-threaded programming environment using C API access to the MySQL database, and gives the corresponding code and analysis. The database is open source database, with a higher maturity level, and the community version can be used for free. It satisfies the need to use the C API access to the database of project development, and reduces development costs.
  Key words:MySQL;C API;multi-threaded
  
  1 引言
  
  随着社会信息化的深入,数据库在社会各个领域被广泛应用。在这些数据库应用项目开发过程中,需要做两方面的决策:1. 使用何种数据库软件;2. 采用何种方式访问数据库。数据库软件的选择面比较宽,在目前众多商业数据库软件中,SQL SERVER 和ORACLE被较多的使用,当然这两个数据库软件的价格也较昂贵,本文选择可免费使用的MySQL数据库社区版本,MySQL库属于开源数据库,具有较高的成熟度和可靠性。数据库的访问方式有很多,可以使用ODBC、DAO、ADO等方法,这些方法简单直接但是效率不高,不适合大型复杂的系统使用,例如网络游戏的数据库系统开发需要考虑同时大量的数据库访问,因此访问的效率非常重要。基于C程序语言的高效率,使用C API访问数据库可以提高数据库的访问效率。基于以上两点,本文将介绍基于C API的MySQL数据库访问方法,给出在单线程和多线程程序环境下的具体代码和分析。
  
  2 建表
  
  为了方便说明数据库的访问,先建立一个数据库表TestTable,可以使用SQL语句创建该表,也可以使用MySQL提供的图形界面来创建。数据库表中字段如下:
  该数据库表使用最常见的用户名和密码作为字段,本文将通过该表来实现不同程序环境下基于C API的数据库的访问方法。
  
  3 单线程程序的数据库访问
  
  单线程应用程序访问MySQL数据库相对简单,其过程包含以下几步:
  (1)初始化MySQL库
  (2)初始化数据库连接句柄
  (3)连接数据库
  (4)通过SQL语句操作数据库并处理相应数据
  (5)关闭数据库连接
  (6)结束MySQL库
  通过这五个步骤即可实现数据库的访问,具体代码和分析如下:
  //在main主函数中添加代码
  //1.定义访问数据库所需变量
  MYSQL * myData;
  MYSQL_RES * res;
  MYSQL_ROW row;
  //2. 初始化MySQL库和数据库连接句柄
  myData = mysql_init((MYSQL*) 0);
  //3. 连接数据库,MYSQL_IP和MYSQL_PORT表示数据库的IP和端口
  // MYSQL_ACCOUNT, MYSQL_PASSWORD表示数据库连接的帐号和密码
  //MYSQL_DBNAME表示所要访问的数据库名
  mysql_real_connect( myData, MYSQL_IP, MYSQL_ACCOUNT, MYSQL_PASSWORD, MYSQL_DBNAME, MYSQL_PORT,NULL, 0 )
  //4. 通过SQL语句操作数据库并处理相应数据
  //4.1新建用户名为abcdef,密码为123456的记录
  mysql_query(myData, "insert into TestTable value(‘abcdef’,’ 123456’)");
  //4.2显示所有记录
  //查询所有记录
  mysql_query(myData, "select * from TestTable");
  //将查询结果保存到res中
  res = mysql_store_result( myData ) ;
  //逐条显示记录
  Int j = 0;
  while ( row = mysql_fetch_row( res ) ) {//获取一条记录
  j = mysql_num_fields( res ) ;//获取每条记录的字段数
  for ( k = 0 ; k < j ; k++ )
  printf( “%s”, row[k] ) ;
  printf( “\n”) ;
  }
  //释放res
  mysql_free_result( res ) ;
  //5. 关闭数据库连接
  mysql_close( myData );
  //6. 结束MySQL库
  mysql_library_end();
  关于代码的几点说明:
  (1)定义变量中的三个数据结构为访问MySQL所需,MYSQL结构表示一个数据库连接的句柄,其中包含了数据库连接所需的参数,MYSQL_RES结构表示数据库访问中一个查询的返回结果,MYSQL_ROW结构表示返回结构中的一条记录;
  (2)获取查询结果res并处理完毕,必须释放res,否则会造成内存泄露
  (3)在单线程时,步骤初始化MySQL库和数据库连接句柄可合并, 由mysql_init()来处理。该函数会自动调用函数mysql_library_init()来初始化MySQL库,同时初始化连接句柄。
  
  4 多线程环境下的数据库访问
  
  多线程环境下的数据库访问需要保证线程安全。Windows版本的MySQL C API函数都是线程安全的,除了mysql_library_init(),而我们刚才的代码中使用的mysql_init()函数会自动调用函数mysql_library_init()来初始化MySQL库,因此在多线程环境下,需要不同的初始化代码和清理代码。具体过程如下:
  (1)在主函数中调用mysql_library_init()来初始化MySQL库;
  (2)启动各数据库访问线程
  (3)主函数等待各个线程的结束
  (4)调用mysql_library_end ()清理MySQL库。
  其中数据库访问线程的代码和单线程数据库访问代码类似,但是需要如下变化:
  (1)单线程中的第2步初始化MySQL库和数据库连接句柄,不能再使用mysql_init(),代码应作如下修改:
  //初始化线程
  my_init();
  mysql_thread_init();
  //初始化myData
  myData = malloc(sizeof(MYSQL));
  memset(&myData, 0, sizeof(MYSQL))
  (2)上述初始化myData,只是将myData所有成员设为0,如果有需要可以根据具体情况设置该结构成员的值,例myData->reconnect= 1,其作用是设置数据库连接属性为重连接,即当数据库连接断开时,自动重新连接;
  (3)单线程中的第6步不在需要,改为结束线程的清理工作,即调用mysql_thread_end()函数。
  
  5 总结
  
  综上所述,使用C API访问MySQL数据库在不同线程环境下的区别主要在于初始化和访问结束后清理代码,也就是说除了初始化和清理代码,MySQL提供给我们的C API函数都是线程安全的。最后需要有一点说明,使用C API访问数据库可以提高数据库的访问效率,但并不是所有的数据库项目都适合这种方式,该方式适合需要大量实时并发处理的数据库项目,例如网络游戏的数据库项目,对于有此需求的数据库项目可参考本文。
  
  参考文献:
  [1]MySQL AB,MySQL 5.0 Reference Manual.
  
  注:“本文中所涉及到的图表、公式注解等形式请以PDF格式阅读原文。”
其他文献
摘要:本论文主要比较了两种多用户上行链路同步估计算法—时域同步与频域同步的性能;最后提出一种新的频率补偿算法使剩余频率快速降到±0.25子载波间距左右,使得频偏估计更具鲁棒性,并说明了算法仿真的有效性。  关键词:多用户OFDM;时域;频域  中图分类号:TN919文献标识码:A文章编号:1009-3044(2007)17-31386-04  Simple Analysis on Multiuse
期刊
摘要:压力测试是Web应用程序测试必不可少的一项工作。现以一个用ASP.NET开发的信息管理系统为例,详细论述如何使用ACT对Web应用程序进行压力测试。  关键词:Web应用程序;压力测试;ACT  中图分类号:TP306文献标识码:A文章编号:1009-3044(2007)17-31405-02  Briefing on Stress Testing of Web Application Pr
期刊
摘要:FLASH设计是目前设计业界界中使用比较广泛的一种形式,本文将着重介绍FLASH设计的现状,并对其发展前景进行详细的分析。  关键词:FLASH;动画;前景  中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)17-31475-02  FLASH Design of the Status and Outlook  LI Qiao-jun,TAO Lin  (Hena
期刊
摘要:随着高等教育改革的进一步深化,许多课程的理论教学学时都不同程度地压缩了。如何在有限的学时内让学生掌握所学知识,是每个教师所面临的新问题。论文主要介绍了在数字电子技术课程的课堂教学中,引入MAX+plusⅡ软件,利用其方便、强大的仿真功能,帮助学生理解课程中的难点和重点,从而提高课堂教学的效率。  关键词:MAX+plusⅡ;数字电子技术;课堂教学  中图分类号:TP311文献标识码:A 文章
期刊
摘要:在C语言中,函数是实现程序模块化设计思想的手段。函数在调用过程中常常存在着实参和形参之间的数据传递。文章阐述了调用函数的过程中实参和形参之间数据传递的实质和属性,即值传递和单向性。  关键词:函数;形参;实参;数据传递  中图分类号:TP312文献标识码:A 文章编号:1009-3044(2007)17-31457-01  Analysis of Data Transferring from
期刊
摘要:VB是高校计算机基础课程之一,适合各种管理信息系统的开发。本文主要对VB基础教学中建构主义思想的运用进行了研究,并分析设计了VB教学过程中的教学方法。  关键词:VB;基础教学;建构主义  中图分类号:G642文献标识码:A 文章编号:1009-3044(2007)17-31455-02  Research of VB Teaching Based on Constructivism  GA
期刊
摘要:基于ASP.NET(C#)Web开发平台,对远程备份与恢复SQLServer数据库的方法进行了简单、详细地介绍;解决了基于WEB方式的远程数据库恢复中我们常常会遇到“因为数据库正在使用,所以未能获得对数据库的排它访问权,RESTORE DATABASE操作异常终止”等问题;高效地实现了远程数据库备份与恢复功能。  关键词:ASP.net;C#;远程备份与恢复;SQLServer数据库  中图
期刊
摘要:随着嵌入式系统的广泛应用,嵌入式系统中的数据存储和数据管理显得日益重要。本文主要介绍flash存储器的存储特点,Linux文件系统的两类存储策略:块式存储和线性存储,并在此基础上提出了一种改进的简单日志文件系统的存储策略。  关键词:Flash;Linux;文件系统存储策略  中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)17-31448-02  A Metho
期刊
摘要:在以Tuxedo为中间件的企业信息系统中,为满足分布式系统的应用,需要解决在Java程序中调用Tuxedo服务的难题,给出了一种免费的、用Visual C++2、Visual Basic3、Jacob组件和Java语言结合编程的方法,详细地解说了方法实现的原理及关键程序代码。  关键词:Java;Tuxedo服务;方法  中图分类号:TP311文献标识码:A文章编号:1009-3044(20
期刊
摘要:随着现在的软件的复杂性日益提高,传统的开发过程和一般的面向对象思想对于软件的开发和维护方面逐渐暴露出它的不足,主要表现在过于僵硬——很难在软件系统里加入一个新性能。过于脆弱——在修改完成之前,无法确切预测到可能会波及到的地方。复用率低、黏度过高——复用系统的某个部分时,总是发现这些已有的代码依赖于很多其他东西。于是面对这些问题就需要可扩展性、灵活性、可插入性的思想,于是设计模式就应运而生。 
期刊