提高Sqlite3数据库的插入、更新等批量操作的执行效率

将Sqlite3数据库移植到我的Linux开发板后,在编码过程后的测试过程中发现一个问题。对数据库的表进行插入或更新操作时,效率不高,我只是测试了更新8条表中记录,居然花费了250毫秒左右。更新60条记录更是花费了6秒多的时间。效率及其低下。
查找资料后找到了原因,主要是因为Sqlite3每次执行sqlite_exec函数执行SQL语句时,都会隐式的调用一次数据库事务功能。这样你调用了多少次sqlite_exec函数,则就调用了多少次事务处理,造成效率极其低下。解决的方法也很简单,就是显式调用事务,在批量操作开始前先显示调用事务开始代码,如下:

sqlite3_exec(db, "BEGIN;", 0, 0, NULL);

然后执行批量插入或更新SQL语句。在批量操作结束后提交事务,如下:

sqlite3_exec(db, "COMMIT;", 0, 0, NULL);

这样就可以在一个事务中处理批量插入或更新操作了。实验后发现更新60条记录费时25毫秒左右。极大提高了执行效率。

整个过程C++模拟代码如下:

sqlite3* db;
string dbName = "./Test.db";
int ret = sqlite3_open(dbName.c_str(), &db);
sqlite3_exec(db, "BEGIN;", 0, 0, NULL);
char szSql[255];
char* errmsg = nullptr;
for(int i=0; i<60; i++)
	snprintf(szSql,255,"Update data Set col1=%d Where col2=%d", i, i);
	ret = sqlite3_exec(db, szSql, 0, 0, &errmsg);
	if(ret!=0)	//执行SQL错误时,显示错误信息
		cout << errmsg << endl;
		sqlite3_free(errmsg);
sqlite3_exec(db, "COMMIT;", 0, 0, NULL);
sqlite3_close(db);

还有一种提高执行效率的方法:关闭写同步。写同步是Sqlite3数据引擎为了在紧急时刻确保数据写入存储器,使系统崩溃或电源出问题后数据库不会损坏。Sqlite3数据库默认写同步是打开的,而且是FULL模式,关闭写同步的代码如下:

sqlite3_exec(db, "PRAGMA synchronous = OFF; ", 0,0,0);

由于我的应用是在嵌入式Linux开发板上执行,经常会遇上断电或重启的情况,故没有关闭写同步。
这就是我在开发中碰到的小问题和解决方法,记录一下备用。

需要在sqlite数据库插入大量测试数据,打算用事务进行循环插入操作,不过sqlite不支持declare变量定义,所以无法通过定义循环变量值来实现。需要通过一个批处理文件来循环调用插入sqlite语句,方式如下 建立一个循环调用的批处理文件sqlite.bat,文件内容 代码如下: @ECHO OFF For /L %%i in (1,1,10000) do (sqlite3.exe test.db<insertdb.bat) pause 这个文件表示循环10000调用insertdb.bat对test.db数据库进行操作。将sqlite语句写在insertdb.bat文件中。 代码
主要代码: DataTable dt = new DataTable(); SQLiteDataAdapter sda = new SQLiteDataAdapter(sql, m_conn);
Android中在sqlite插入数据的时候默认一条语句就是一个事务,因此如果存在上万条数据插入的话,那就需要执行上万次插入操作操作速度可想而知。因此在Android中插入数据时,使用批量插入的方式可以大大提高插入速度。 有时需要把一些数据内置到应用中,常用的有以下几种方式: 1、使用db.execSQL(sql) 这里是把要插入的数据拼接成可执行sql语句,然后调用db.execSQL(sql)方法执行插入。 public void inertOrUpdateDateBatch(List sqls) { SQLiteDatabase db = getWritab
Node.js可以使用sqlite3模块来操作SQLite数据库。以下是基本的步骤: 1. 安装sqlite3模块:在命令行中运行npm install sqlite3命令。 2. 在Node.js中引入sqlite3模块:const sqlite3 = require('sqlite3').verbose(); 3. 打开数据库连接:const db = new sqlite3.Database('path/to/database.db'); 4. 执行SQL语句:db.run('CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)'); 5. 查询数据:db.all('SELECT * FROM users', (err, rows) => { console.log(rows); }); 6. 关闭数据库连接:db.close(); 以上是基本的操作SQLite数据库的步骤,具体的操作可以根据需要进行调整。
weixin_38841555: 博主,请问下这个代码是作为客户端,modbus slave作为服务端的吗? 我们的设备是反的,代码是服务端,不指定硬件ip,服务端先发命令硬件(硬件里写了服务端ip)会回复。 请问这种该怎么调整呢? 嵌入式Linux中使用SQLite3数据库 Silent starry sky: 你要把头文件拷贝到源码目录下,链接时要指定sqlite3的库目录。