- 论坛徽章:
- 0
|
v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
st1\:*{behavior:url(#ieooui) }
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman";
mso-ansi-language:#0400;
mso-fareast-language:#0400;
mso-bidi-language:#0400;}
在嵌入式Linux上实现SQLite数据库
Author:
mistry(qibing83@yahoo.com.cn)
1.1
SQLite在PC机上的实现
1.1.1
下载及安装
到网站:http://www.sqlite.org/download.html 上下载最新的版本或到chinaunix.com上下载sqlite-3.3.5。
解压后,configure的时候要指定安装路径和去掉tcl的支持,#./configure
–disable-tcl –prefix=/home/qibing/opt,然后#make #make install即可。安装后在安装目录的lib下有libsqlite3.a库和在include下有sqlite3.h头文件。
1.1.2
编译文件及验证
在目录sqlite下编辑文件hello.c,
Hello.c
#include
#include
static
int callback(void *NotUsed, int argc, char **argv, char **azColName)
{
int i;
for (i = 0; i
printf("%s = %s\n",
azColName, argv ? argv : "NULL");
}
printf("\n");
return 0;
}
int
main(int argc, char **argv)
{
sqlite3 *db;
char *zErrMsg = 0;
int rc;
if (argc != 3) {
fprintf(stderr, "Usage: %s
DATABASE SQL-STATEMENT\n", argv[0]);
exit(1);
}
rc = sqlite3_open(argv[1], &db);
if (rc) {
fprintf(stderr, "Can't open
database: %s\n", Sqlite3_errmsg(db));
sqlite3_close(db);
exit(1);
}
rc = sqlite3_exec(db, argv[2], callback, 0,
&zErrMsg);
if (rc != SQLite_OK) {
fprintf(stderr, "SQL error:
%s\n", zErrMsg);
sqlite3_free(zErrMsg);
}
sqlite3_close(db);
return 0;
}
End of hello.c
运行下面命令编译,
gcc
-I/home/qibing/opt/include -L/home/qibing/opt/lib -o hello hello.c -lsqlite3
其中-I指定sqlite3头文件的路径,-L指定sqlite3的lib库路径,-lsqlite3表示链接到sqlite3库。另外运行时还需要把/home/qibing/opt/lib路径加到LD_LIBRARY_PATH环境变量中,
#export
LD_LIBRARY_PATH=$LD_LIBRARY_PATH: /home/qibing/opt/lib
自此,运行hello程序后跟SQL命令就可以操作数据库了。
参考《在ARM-Linux平台上移植SQLite》
![]()
文件:hello.rar
大小:0KB
下载:
下载
1.2
SQLite3的移植工作
1.1.3
修改Makefile.linux-gcc文件
在SQLite源代码根目录下有一个Makefile.linux-gcc文件是交叉编译的参考Makefile原型。可以直接修改Makefile.linux-gcc这个文件,并在make的时候指定此文件。
l
修改TOP,指定项目的根目录
l
修改编译器、归档工具等为交叉编译工具
l
去掉与TCL相关的编译选项,sqlite默认情况下会绑定tcl语言的,在这里我们不需要,可以在此处去掉
然后,#make –f Makefie.linux-gcc 即可。
1.1.4
SQLite的输入和输出
SQLite3是通过控制台进行用户交互的。默认情况下,SQLite的输入为stkin,输出为stkout,数据库保存在memory即内存中,SQLite是内存型数据库。
在实际应用中,数据库系统需要与MainControl进程交互,即MainControl进程将SQL语句输入给SQLite,然后由SQLite将输出结果发给MainControl进程,并将中间的数据操作结果保存在Flash中。
l
输入,输入源为MainControl进程,通过进程间通讯实现,传输的数据大部分为SQL语句
l
输出,输出源为MainControl进程,这里的数据有时会很大,暂时不考虑进程间通讯方式
1.1.5
操作结果保存在Flash上
将SQLite的数据库操作结果保存在flash上有两种方法,
l
将flash通过mount的方式挂载到Linux的文件系统上
l
用Flash的驱动接口改写Os_Linux.c下的UnixRead()函数的实现方式
这里我们用第一种方法实现,只需把flash mount到文件系统上,并在mount的目录下建立数据库文件data.db即可。
1.3
数据库事务性能优化
通过查看SQLite数据库事务处理的实现,事务处理模块对一个事务的最终处理是分解为多个指令而完成的。那么对于频繁操作的事务而言,数据库实现很耗时,可以通过改变执行方式来优化这些处理。在一个整体事务开始前,通过sqlite_exec()调用”BEGIN”命令禁止启动事务并禁止“自动提交”特性。整体事务完成后,通过sqlite_exec()调用”COMMIT”命令进行事务提交并启用“自动提交”特性。
下面是实现方式的模型,
事务性能的优化
cha
*pcBegin = "BEGIN";
sqlite3_exec(data.db,
pcBegin, 0, 0, 0);
int
i;
for(i
= 0; i {
char acInsertStr[64] = {0};
snprintf(acInsertStr, 63,
"%s%s", "INSERT INFO workers VALUES(", ,
'qixiangbing');");
sqlite3_exec(data.db, acInsertStr, 0,
(void *)&pcErrorMsg);
}
char
*pcCommit = "COMMIT";
sqlite3_exec(data.db,
pcCommit, 0, 0, 0);
End of 事务性能的优化
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/70351/showart_1003351.html |
|