当一次业务处理计算服务和数据库交互较多时,将可能有大量时间浪费在数据传输上,尤其对于计算服务和数据库跨机房或跨地区部署时,浪费的时间会极其可观。为了减少时间浪费可以使用MySQL提供的SQL打包功能。

先来认识两个标记:
CLIENT_MULTI_RESULTS:Tell the server that the client can handle multiple result sets from multiple-statement executions or stored procedures. This flag is automatically enabled if CLIENT_MULTI_STATEMENTS is enabled.
CLIENT_MULTI_STATEMENTS:Tell the server that the client may send multiple statements in a single string (separated by “;”). If this flag is not set, multiple-statement execution is disabled.

接下来通过一个例子了解如何使用MySQL这个功能:

新建表结构:

字段 类型 描述
id bigint(20) unsigned 自增ID,主键
trans_id varchar(32) 业务单据号,唯一索引
comments text 备注

主要代码:

#include <stdio.h>
#include <string.h>
#include "mysql.h" int main(int argc, const char* argv[])
{
bool deal_ok = true; MYSQL* db_session = ; // init db
if (deal_ok)
{
db_session = mysql_init(db_session); if ( != db_session)
{
printf("init db\n");
}
else
{
deal_ok = false;
printf(" init db error\n");
}
} //connect db
if (deal_ok)
{
char db_host[] = {"127.0.0.1"};
char db_user[] = {"test"};
char db_pass[] = {""};
unsigned long db_port = ;
unsigned long conn_flag = CLIENT_MULTI_STATEMENTS | CLIENT_REMEMBER_OPTIONS; if (mysql_real_connect(db_session, db_host, db_user, db_pass, , db_port, , conn_flag))
{
printf("connect successed\n");
}
else
{
deal_ok = false;
printf("connect error: %s\n", mysql_error(db_session));
}
} //start transaction
if (deal_ok)
{
int db_ret = mysql_query(db_session, "START TRANSACTION");
if ( == db_ret)
{
printf("start transaction\n");
}
else
{
deal_ok = false;
printf("start transaction error: %s\n", mysql_error(db_session));
}
} //operate db
if (deal_ok)
{
char db_sql[] = {};
strcat(db_sql, "INSERT INTO test_db.test(trans_id, comments) VALUES(110, 'test');");
strcat(db_sql, "UPDATE test_db.test SET comments = 'modify' WHERE trans_id = '108';"); printf("operate db: %s\n", db_sql); int db_ret = mysql_real_query(db_session, db_sql, strlen(db_sql));
if ( == db_ret)
{
while ( == db_ret)
{
          int affected_rows = (int)mysql_affected_rows(db_session);
          deal_ok = deal_ok && (0 < affected_rows);
printf(" affected rows : %d\n", affected_rows); db_ret = mysql_next_result(db_session);
}
}
else
{
deal_ok = false;
printf("\terror: %s\n", mysql_error(db_session));
}
} //complete transaction
if ( != db_session)
{
if (deal_ok)
{
mysql_commit(db_session);
printf("commit\n");
}
else
{
mysql_rollback(db_session);
printf("rollback\n");
} mysql_close(db_session);
} return ;
}

MySQL打包执行SQL的更多相关文章

  1. MySQL命令执行sql文件的两种方法

    MySQL命令执行sql文件的两种方法 摘要:和其他数据库一样,MySQL也提供了命令执行sql脚本文件,方便地进行数据库.表以及数据等各种操作.下面笔者讲解MySQL执行sql文件命令的两种方法,希 ...

  2. MySQL中执行sql语句错误 Error Code: 1093. You can't specify target table 'car' for update in FROM clause

    MySQL中执行sql语句错误 Error Code: 1093. You can't specify target table 'car' for update in FROM clause 201 ...

  3. mysql批量执行sql文件

    1.待执行的sql文件为1.sql.2.sql.3.sql.4.sql等 2.写一个batch.sql文件: source .sql; source .sql; source .sql; source ...

  4. MySQL学习系列一---命令行连接mysql和执行sql文件

    1.命令行连接mysql #mysql -h(主机) -u(用户名) -p (数据库名) mysql -hlocalhost -uroot -p testdb Enter password: **** ...

  5. Python连接MySQL数据库执行sql语句时的参数问题

    由于工作需要,今天写了一个Python小脚本,其中需要连接MySQL数据库,在执行sql命令时需要传递参数,结果出问题了.在网上查了一下,发现有以下几种方式传递参数: 一.直接把sql查询语句完整写入 ...

  6. mysql source 执行sql脚本,中文变量不显示问题或乱码问题

    执行脚本内容如下: SET @pre_version=2017080901; SET @cur_version=2017090401; SET @ver_desc = '测试脚本'; CALL pro ...

  7. Entity Framework 在MySQL中执行SQL语句,关于参数问题

    在Entity Framework中添加MySQL模型,在写代码的过程中需要直接执行SQL语句. 在SQL语句中用到了@curRank := 0 这样在SQL语句中定义参数,同时还会有传入参数:ai. ...

  8. JDBC连接MYSQL,批量执行SQL语句或在执行一个SQL语句之前执行一个SQL语句

    conn = MysqlJdbcUtils.getConnection(); Statement ps=conn.createStatement(); ps.addBatch("trunca ...

  9. (转载)MySQL中执行sql语句反斜杠需要进行转义否则会被吃掉

    (转载)http://www.phpcode8.com/lamp/mysql-lamp/mysql-escape-slash.html 最近在执行一个sql备份的还原后,发现系统的部分路径找不到,于是 ...

随机推荐

  1. [FTP]通过FileZilla在阿里云主机上搭建ftp服务器

    前一阵子租了一台服务器主机来玩,正好周末有时间研究了一下怎么搭建ftp server. 准备.首先要下载filezilla client和filezilla server, 下载地址: server: ...

  2. url获取整理

    $_SERVER['DOCUMENT_ROOT'];   //网站的根目录 echo $_SERVER['SERVER_NAME']; //当前的服务器域名 echo $_SERVER['HTTP_H ...

  3. Azure导出所有用户权限---powershell命令

      直接运行脚本         #requires -Version 3.0 -Modules AzureRM.Resourcesparam(    [switch]    $GroupRolesB ...

  4. toast提示信息获取

    toast获取的前提条件 1.desired_caps["automationName"]="UiAutomator2"2.要求安装jdk1.8 64位及以上. ...

  5. 使用FreeCookies 控制浏览器cookies及修改http响应内容

    FreeCookies 插件安装 :您的计算机需要已经安装Fiddler (如未安装,请至官网下载安装 http://docs.telerik.com/fiddler/configure-fiddle ...

  6. 8年,从2D到3D,我的学习之路

    Mickey 写了一篇 <一个本科毕业生创业两年的感悟>,从他的视角,总结了我们合作的两年经历. 我也来写一篇,介绍我的学习之路,希望对大家有所帮助,谢谢大家- 我的学习方法 1.直接从0 ...

  7. codeforces#1139D. Steps to One (概率dp+莫比乌斯反演)

    题目链接: http://codeforces.com/contest/1139/problem/D 题意: 在$1$到$m$中选择一个数,加入到一个初始为空的序列中,当序列的$gcd$和为$1$时, ...

  8. ABP中的Filter(下)

    接着上面的一个部分来叙述,这一篇我们来重点看ABP中的AbpUowActionFilter.AbpExceptionFilter.AbpResultFilter这三个部分也是按照之前的思路来一个个介绍 ...

  9. 标准3层神经网络搭建Demo

    上面我们说了神经网络的基础知识,根据上章的基础尝试搭建一个标准的3层神经网络,参考https://www.cnblogs.com/bestExpert/p/9128645.html 1.框架代码 1. ...

  10. CF 543C Remembering Strings

    https://cn.vjudge.net/problem/CodeForces-543C 题目 You have multiset of n strings of the same length, ...