当前位置:首页 > 芯闻号 > 充电吧
[导读]三、高效的批量数据插入:    在给出操作步骤之前先简单说明一下批量插入的概念,以帮助大家阅读其后的示例代码。事实上,批量插入并不是什么新的概念,在其它关系型数据库的C接口API中都提供了一定的支持,



三、高效的批量数据插入:


    在给出操作步骤之前先简单说明一下批量插入的概念,以帮助大家阅读其后的示例代码。事实上,批量插入并不是什么新的概念,在其它关系型数据库的C接口API中都提供了一定的支持,只是接口的实现方式不同而已。纵观众多流行的数据库接口,如OCI(Oracle API)、MySQL API和PostgreSQL API等,OCI提供的编程接口最为方便,实现方式也最为高效。SQLite作为一种简单灵活的嵌入式数据库也同样提供了该功能,但是实现方式并不像其他数据库那样方便明显,它只是通过一种隐含的技巧来达到批量插入的目的,其逻辑如下:
    1). 开始一个事物,以保证后面的数据操作语句均在该事物内完成。在SQLite中,如果没有手工开启一个事物,其所有的DML语句都是在自动提交模式下工作的,既每次操作后数据均被自动提交并写入磁盘文件。然而在非自动提交模式下,只有当其所在的事物被手工COMMIT之后才会将修改的数据写入到磁盘中,之前修改的数据都是仅仅驻留在内存中。显而易见,这样的批量写入方式在效率上势必会远远优于多迭代式的单次写入操作。
    2). 基于变量绑定的方式准备待插入的数据,这样可以节省大量的sqlite3_prepare_v2函数调用次数,从而节省了多次将同一SQL语句编译成SQLite内部识别的字节码所用的时间。事实上,SQLite的官方文档中已经明确指出,在很多时候sqlite3_prepare_v2函数的执行时间要多于sqlite3_step函数的执行时间,因此建议使用者要尽量避免重复调用sqlite3_prepare_v2函数。在我们的实现中,如果想避免此类开销,只需将待插入的数据以变量的形式绑定到SQL语句中,这样该SQL语句仅需调用sqlite3_prepare_v2函数编译一次即可,其后的操作只是替换不同的变量数值。
    3). 在完成所有的数据插入后显式的提交事物。提交后,SQLite会将当前连接自动恢复为自动提交模式。
    
    下面是示例代码的实现步骤:
    1). 创建测试数据表。
    2). 通过执行BEGIN TRANSACTION语句手工开启一个事物。
    3). 准备插入语句及相关的绑定变量。
    4). 迭代式插入数据。
    5). 完成后通过执行COMMIT语句提交事物。

    6). 删除测试表。




#include#include#includeusing namespace std;
 
 void doTest()
 {
     sqlite3* conn = NULL;
     //1. 打开数据库
     int result = sqlite3_open("D:/mytest.db",&conn);
     if (result != SQLITE_OK) {
         sqlite3_close(conn);
         return;
     }
     const char* createTableSQL = 
         "CREATE TABLE TESTTABLE (int_col INT, float_col REAL, string_col TEXT)";
     sqlite3_stmt* stmt = NULL;
     int len = strlen(createTableSQL);
     //2. 准备创建数据表,如果创建失败,需要用sqlite3_finalize释放sqlite3_stmt对象,以防止内存泄露。
     if (sqlite3_prepare_v2(conn,createTableSQL,len,&stmt,NULL) != SQLITE_OK) {
         if (stmt)
             sqlite3_finalize(stmt);
         sqlite3_close(conn);
         return;
     }
     //3. 通过sqlite3_step命令执行创建表的语句。对于DDL和DML语句而言,sqlite3_step执行正确的返回值
     //只有SQLITE_DONE,对于SELECT查询而言,如果有数据返回SQLITE_ROW,当到达结果集末尾时则返回
     //SQLITE_DONE。
     if (sqlite3_step(stmt) != SQLITE_DONE) {
         sqlite3_finalize(stmt);
         sqlite3_close(conn);
         return;
     }
     //4. 释放创建表语句对象的资源。
     sqlite3_finalize(stmt);
     printf("Succeed to create test table now.n");
 
     //5. 显式的开启一个事物。
     sqlite3_stmt* stmt2 = NULL;
     const char* beginSQL = "BEGIN TRANSACTION";
     if (sqlite3_prepare_v2(conn,beginSQL,strlen(beginSQL),&stmt2,NULL) != SQLITE_OK) {
         if (stmt2)
             sqlite3_finalize(stmt2);
         sqlite3_close(conn);
         return;
     }
     if (sqlite3_step(stmt2) != SQLITE_DONE) {
         sqlite3_finalize(stmt2);
         sqlite3_close(conn);
         return;
     }
     sqlite3_finalize(stmt2);
 
     //6. 构建基于绑定变量的插入数据。
     const char* insertSQL = "INSERT INTO TESTTABLE VALUES(?,?,?)";
     sqlite3_stmt* stmt3 = NULL;
     if (sqlite3_prepare_v2(conn,insertSQL,strlen(insertSQL),&stmt3,NULL) != SQLITE_OK) {
         if (stmt3)
             sqlite3_finalize(stmt3);
         sqlite3_close(conn);
         return;
     }
     int insertCount = 10;
     const char* strData = "This is a test.";
     //7. 基于已有的SQL语句,迭代的绑定不同的变量数据
     for (int i = 0; i < insertCount; ++i) {
         //在绑定时,最左面的变量索引值是1。
         sqlite3_bind_int(stmt3,1,i);
         sqlite3_bind_double(stmt3,2,i * 1.0);
         sqlite3_bind_text(stmt3,3,strData,strlen(strData),SQLITE_TRANSIENT);
         if (sqlite3_step(stmt3) != SQLITE_DONE) {
             sqlite3_finalize(stmt3);
             sqlite3_close(conn);
             return;
         }
         //重新初始化该sqlite3_stmt对象绑定的变量。
         sqlite3_reset(stmt3);
         printf("Insert Succeed.n");
     }
     sqlite3_finalize(stmt3);
 
     //8. 提交之前的事物。
     const char* commitSQL = "COMMIT";
     sqlite3_stmt* stmt4 = NULL;
     if (sqlite3_prepare_v2(conn,commitSQL,strlen(commitSQL),&stmt4,NULL) != SQLITE_OK) {
         if (stmt4)
             sqlite3_finalize(stmt4);
         sqlite3_close(conn);
         return;
     }
     if (sqlite3_step(stmt4) != SQLITE_DONE) {
         sqlite3_finalize(stmt4);
         sqlite3_close(conn);
         return;
     }
     sqlite3_finalize(stmt4);
 
     //9. 为了方便下一次测试运行,我们这里需要删除该函数创建的数据表,否则在下次运行时将无法
     //创建该表,因为它已经存在。
     const char* dropSQL = "DROP TABLE TESTTABLE";
     sqlite3_stmt* stmt5 = NULL;
     if (sqlite3_prepare_v2(conn,dropSQL,strlen(dropSQL),&stmt5,NULL) != SQLITE_OK) {
         if (stmt5)
             sqlite3_finalize(stmt5);
         sqlite3_close(conn);
         return;
     }
     if (sqlite3_step(stmt5) == SQLITE_DONE) {
         printf("The test table has been dropped.n");
     }
     sqlite3_finalize(stmt5);
     sqlite3_close(conn);
 }
 
 int main()
 {
     doTest();
     return 0;
 }
 //输出结果如下:
 //Succeed to create test table now.
 //Insert Succeed.
 //Insert Succeed.
 //Insert Succeed.
 //Insert Succeed.
 //Insert Succeed.
 //Insert Succeed.
 //Insert Succeed.
 //Insert Succeed.
 //Insert Succeed.
 //Insert Succeed.
 //The test table has been dropped.




本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

科睿唯安《全球创新Top100》以该公司拥有的专利数据库为基础,根据“成功率”、“地域投资”、“影响力”、“稀缺性”四个评价维度对知识产权进行分析,评选出全球百强创新企业和机构。该评选从2012年开始每年实施一次,202...

关键字: 数据库 5G 人工智能

北京——2024年2月26日 日前,领先的IT市场研究和咨询公司IDC发布《IDC MarketScape:全球云计算和以应用为中心的市场供应商评估》1报告,亚马逊位列“领导者”类别。报告指出,“亚马逊云科技Market...

关键字: 云计算 数据库 存储

北京——2023年12月27日 在2023亚马逊云科技re:Invent全球大会上,亚马逊云科技表彰了在过去一年中,利用亚马逊云科技的技术和服务在推动客户创新及解决方案构建方面做出杰出贡献的卓越合作伙伴。8家亚马逊云科技...

关键字: 数智化转型 机器学习 数据库

北京——2023年12月7日 亚马逊云科技在2023 re:Invent全球大会上,宣布推出三项新的无服务器服务创新,涵盖了数据库和分析领域,使客户能够更快速、更轻松地扩展他们的数据基础设施,以支持最具挑战性的应用场景。...

关键字: 服务器 人工智能 数据库

北京——2023年12月4日 亚马逊云科技在2023 re:Invent全球大会上,宣布推出一系列新的集成解决方案,旨在帮助客户迅速而轻松地连接和分析数据,而无需构建和管理复杂的提取、转换和加载(ETL)数据管道。通过全...

关键字: 数据存储 数据库 人工智能

北京——2023年11月13日 亚马逊云科技携手凯捷(Capgemini)中国共同发布《汽车行业可持续发展白皮书》(以下简称《白皮书》),并助力凯捷中国推出碳排放管理平台,致力于以数智化方式帮助车企解决在实践可持续发展过...

关键字: 数据库 机器学习 电动汽车

11月1日,由开放原子开源基金会主办,电子科技大学承办,深圳市腾讯计算机系统有限公司提供战略合作支持的2023年开放原子校源行(成都站)活动在电子科技大学圆满举行。本次活动以“聚缘于校,开源共行”为主题,将四川省在信息技...

关键字: 开源模式 操作系统 数据库

11月1日,2023杭州云栖大会上,阿里云瑶池数据库宣布已全面实现Serverless化,并接入通义等大模型能力,大幅提升数据库一站式及智能化水平。同时,PolarDB Always On系列推出3大重磅升级,首个数据智...

关键字: Serverless AI 阿里云 数据库

北京2023年9月8日 /美通社/ -- 日前,"云融数智 创领未来"2023浪潮云海云图生态峰会产品技术伙伴专场在北京成功举办。来自开源基金会、云安全、PaaS、数据库服务、容灾备份等领域的头部领先...

关键字: 云安全 私有云 数据库 NI

北京2023年9月7日 /美通社/ -- 在欧盟推出碳边境调节机制(CBAM)的背景下,为了更好的提升中国相关工业企业在碳排放管理方面的能力,推进中国与欧盟相关机制的国际合作,2023年9月3日于北京,DEKRA德凯受国...

关键字: 供应链 可持续发展 ISO 数据库
关闭
关闭