为什么80%的码农都做不了架构师?>>>   

1. 单线程程序的数据库访问

(1)初始化MySQL库 
  (2)初始化数据库连接句柄 
  (3)连接数据库 
  (4)通过SQL语句操作数据库并处理相应数据 
  (5)关闭数据库连接 
  (6)结束MySQL库 
  通过这五个步骤即可实现数据库的访问,具体代码和分析如下:

//1.定义访问数据库所需变量
MYSQL    * myData;
MYSQL_RES    * res;
MYSQL_ROW    row;//2. 初始化MySQL库和数据库连接句柄
myData = mysql_init((MYSQL*) 0); //3. 设置选项
mysql_options(myData, MYSQL_SET_CHARSET_NAME , “utf8”);
char cOpt = 1;
mysql_options(myData, MYSQL_OPT_RECONNECT, cOpt);//4. 连接数据库,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 ) //5. 通过SQL语句操作数据库并处理相应数据 //5.1 新建用户名为abcdef,密码为123456的记录 mysql_query(myData, "insert into TestTable value(‘abcdef’,’ 123456’)"); //5.2 显示所有记录  mysql_query(myData, "select * from TestTable"); //5.3 将查询结果保存到res中 res = mysql_store_result( myData ) ; //5.4 逐条显示记录 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”) ; }} //5.5 释放res mysql_free_result( res ) ; //6. 检查数据库连接是否有效,当且仅当设置了MYSQL_OPT_RECONNECT选项有效
unsigned long qwPreId = mysql_thread_id( myData );//重连之前的id
mysql_ping( myData );
unsigned long qwNextId = mysql_thread_id( myData );//重连之后的id//7. 关闭数据库连接
mysql_close( myData ); //8. 结束MySQL库
mysql_library_end(); 

关于代码的几点说明: 
  (1)定义变量中的三个数据结构为访问MySQL所需,MYSQL结构表示一个数据库连接的句柄,其中包含了数据库连接所需的参数,MYSQL_RES结构表示数据库访问中一个查询的返回结果,MYSQL_ROW结构表示返回结构中的一条记录; 
  (2)获取查询结果res并处理完毕,必须释放res,否则会造成内存泄露 。
  (3)在单线程时,步骤初始化MySQL库和数据库连接句柄可合并, 由mysql_init()来处理。该函数会自动调用函数mysql_library_init()来初始化MySQL库,同时初始化连接句柄。 
  (4)mysql_connect()是已经废弃的方法,它参数的含义和mysql_real_connect()是一致的,唯一不同的是MYSQL指针可能为空,在这种情况下,API会自动管理这部分内存,这将会导致当连接失败时,无法获取错误信息,因为获取错误信息需要有效的MYSQL指针 。
  (5)mysql_query()与mysql_real_query() 的区别是mysql_query不能包含任何的二进制数据(例如BLOB字段),因为二进制信息中的\0会被误判为语句结束。
  (6)如果频繁地调用 mysql_init 和 mysql_close 的话,记得在 mysql_close 之后调用 mysql_library_end() 来释放未被释放的内存,否则会出现内存泄漏

2. 多线程环境下的数据库访问

  多线程环境下的数据库访问需要保证线程安全。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.定义访问数据库所需变量
MYSQL    * myData;
MYSQL_RES    * res;
MYSQL_ROW    row;//2. 初始化MySQL库和数据库连接句柄
mysql_init();
mysql_thread_init(); //3. 初始化myData
myData = malloc(sizeof(MYSQL));
memset(&myData, 0, sizeof(MYSQL)) //4. 设置选项
mysql_options(myData, MYSQL_SET_CHARSET_NAME , “utf8”);
char cOpt = 1;
mysql_options(myData, MYSQL_OPT_RECONNECT, cOpt);//5. 连接数据库,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 ) //6. 通过SQL语句操作数据库并处理相应数据 //6.1 新建用户名为abcdef,密码为123456的记录 mysql_query(myData, "insert into TestTable value(‘abcdef’,’ 123456’)"); //6.2 显示所有记录  mysql_query(myData, "select * from TestTable"); //6.3 将查询结果保存到res中 res = mysql_store_result( myData ) ; //6.4 逐条显示记录 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”) ; }} //6.5 释放res mysql_free_result( res ) ; //7. 检查数据库连接是否有效,当且仅当设置了MYSQL_OPT_RECONNECT选项有效
unsigned long qwPreId = mysql_thread_id( myData );//重连之前的id
mysql_ping( myData );
unsigned long qwNextId = mysql_thread_id( myData );//重连之后的id//8. 关闭数据库连接
mysql_close( myData ); //9. 结束MySQL库
mysql_thread_end();

3. 连接池

(1) 初始化多个connection,每个connection包含数据库初始化和关闭,连接池采用单例模式

(2) 选取connection,异常返回空

(3) 关闭多个connection并回收连接池资源

连接池可参考:http://www.oschina.net/code/snippet_583625_19818#32990

转载于:https://my.oschina.net/shou1156226/blog/752337

MySql 基于C_API的数据库封装相关推荐

  1. 基于SqlSugar的数据库访问处理的封装,支持多数据库并使之适应于实际业务开发中

    Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/cou ...

  2. python mysql 基于 sqlalvhrmy_Python基于DB-API操作MySQL数据库过程解析

    Python提供了一个标准数据库API,称为DB-API,用于处理基于SQL的数据库. 与任何底层数据库的交互都可以使用DB-API,因为DB-API在代码与驱动程序之间提供了一个抽象层,可以根据需要 ...

  3. ef mysql 读写分离_基于 EntityFramework 的数据库主从读写分离服务插件

    基于 EntityFramework 的数据库主从读写分离服务插件 1. 版本信息和源码 1.1版本信息 v1.01 beta(2015-04-07),基于 EF 6.1 开发,支持 EF 6.1 之 ...

  4. 最新2023基于微信小程序的奶茶店自助饭店点餐订餐系统平台(SSM+mysql)-JAVA.VUE【数据库设计、论文、毕设源码、开题报告】

    摘 要 使用智能手机的用户经过多年的使用习惯,已经越来越不喜欢安装各种的APP,除了正常生活和工作所必须的APP,不喜欢因为喜欢某些内容而被强制安装APP软件了.最近几年,随着微信生态的布局,通过开发 ...

  5. wpf c 登录注册 mysql代码代码_Wpf+数据库代码封装+策略模式封装

    运行界面: 数据库保存的题: 数据库封装代码: using System; using System.Collections.Generic; using System.Linq; using Sys ...

  6. 基于MYSQL的论坛管理系统数据库设计项目实战

    说明:这是一个数据库课程设计实战项目(附带代码+文档+视频讲解),如需代码+文档+视频讲解可以直接到文章最后获取. 项目背景 随着互联网行业的发展,各种论坛纷纷而来.在论坛系统中,可让用户注册成为论坛 ...

  7. MySql基础篇---001 数据库概述与MySQL安装篇:概述,表和类对应关系,表关系、数据库卸载,下载,安装,配置,启动,登录,演示,图形化工具,目录结构,常见问题

    第01章_数据库概述 讲师:尚硅谷-宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com 1. 为什么要使用数据库 持久化(persistence):把数据保存到可掉电式存储 ...

  8. 路由器snmp配置_基于keepalived配置数据库主从实现高可用

    基于keepalived配置数据库主从实现高可用 使用keepalived来监听端口,实现数据库的高可用.实现效果,其中一台数据库服务器突然出故障或关机时,应该不影响应用正常运行,等待服务器启动之后, ...

  9. rsyslog概要以及源码安装mysql,rsyslog输出到Mysql基于loganalyzer查看分析

    Rsyslog:syslog的加强版本 日志对于系统中程序和服务的运行起着很大的作用,我们经常需要去看日志记录来查看各种信息,有用户登录信息,有网页访问信息,有系统故障信息,等等.. 日志通常有日志级 ...

最新文章

  1. 详解最大似然估计(MLE)、最大后验概率估计(MAP),以及贝叶斯公式的理解...
  2. 计算机组成原理的判断题,2《计算机组成原理A》判断题
  3. 自建邮件服务器给企业带来的商业价值
  4. 从无到有算法养成篇-线性表历练
  5. layDate控件的使用
  6. eclipse项目迁移到Android Studio
  7. OpenCV C++ 10 - Invert Images
  8. 妲己机器人需要什么条件才能使用_estar零封YTG:平头哥快乐电竞,只有妲己没亚瑟,差评...
  9. CentOS7 安装 NextCloud
  10. EMLOG复制网站文字提醒弹窗源码美化版
  11. 查看oracle索引状态,oracle监控索引的使用情况
  12. 微型计算机主板上安装的主要部件有,微型计算机的主板上安装的主要部件有()....
  13. matlab分析xml文件_如何在Java中读取XML文件(DOM分析器)
  14. MyBatis简介及下载
  15. python和origin数据分析_【Origin】【Python】大学物理实验数据处理
  16. 软件智能:aaas系统 后天八卦-aaas作为组织者的数据结构及其运行时
  17. 信奥赛1990:【19CSPS提高组】划分
  18. Go语言核心之美 2.6-常量
  19. uniapp 评价应用_uniapp打开应用市场(APP端)
  20. python人机对话存在的问题_如何适应人机对话要点及情景问题

热门文章

  1. 技本功丨呀~我不会写CSS之vertical-align(上集)
  2. sql语句里的limit使用方法
  3. injectionForXcode代码注入步骤
  4. 数组的一些常用方法记录
  5. Mysql中的count()与sum()区别
  6. osc上一位哥们的 php编译参数
  7. Exchange 2010 OAB无法更新
  8. distinct 多列问题 group by 解决
  9. HDU 2094 产生冠军
  10. 网页性能优化之异步加载js文件