- 論壇徽章:
- 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上實(shí)現(xiàn)SQLite數(shù)據(jù)庫(kù)
Author:
mistry(qibing83@yahoo.com.cn)
1.1
SQLite在PC機(jī)上的實(shí)現(xiàn)
1.1.1
下載及安裝
到網(wǎng)站:http://www.sqlite.org/download.html 上下載最新的版本或到chinaunix.com上下載sqlite-3.3.5。
解壓后,configure的時(shí)候要指定安裝路徑和去掉tcl的支持,#./configure
–disable-tcl –prefix=/home/qibing/opt,然后#make #make install即可。安裝后在安裝目錄的lib下有l(wèi)ibsqlite3.a庫(kù)和在include下有sqlite3.h頭文件。
1.1.2
編譯文件及驗(yàn)證
在目錄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
運(yùn)行下面命令編譯,
gcc
-I/home/qibing/opt/include -L/home/qibing/opt/lib -o hello hello.c -lsqlite3
其中-I指定sqlite3頭文件的路徑,-L指定sqlite3的lib庫(kù)路徑,-lsqlite3表示鏈接到sqlite3庫(kù)。另外運(yùn)行時(shí)還需要把/home/qibing/opt/lib路徑加到LD_LIBRARY_PATH環(huán)境變量中,
#export
LD_LIBRARY_PATH=$LD_LIBRARY_PATH: /home/qibing/opt/lib
自此,運(yùn)行hello程序后跟SQL命令就可以操作數(shù)據(jù)庫(kù)了。
參考《在A(yíng)RM-Linux平臺(tái)上移植SQLite》
![]()
文件:hello.rar
大小:0KB
下載:
下載
1.2
SQLite3的移植工作
1.1.3
修改Makefile.linux-gcc文件
在SQLite源代碼根目錄下有一個(gè)Makefile.linux-gcc文件是交叉編譯的參考Makefile原型?梢灾苯有薷腗akefile.linux-gcc這個(gè)文件,并在make的時(shí)候指定此文件。
l
修改TOP,指定項(xiàng)目的根目錄
l
修改編譯器、歸檔工具等為交叉編譯工具
l
去掉與TCL相關(guān)的編譯選項(xiàng),sqlite默認(rèn)情況下會(huì)綁定tcl語(yǔ)言的,在這里我們不需要,可以在此處去掉
然后,#make –f Makefie.linux-gcc 即可。
1.1.4
SQLite的輸入和輸出
SQLite3是通過(guò)控制臺(tái)進(jìn)行用戶(hù)交互的。默認(rèn)情況下,SQLite的輸入為stkin,輸出為stkout,數(shù)據(jù)庫(kù)保存在memory即內(nèi)存中,SQLite是內(nèi)存型數(shù)據(jù)庫(kù)。
在實(shí)際應(yīng)用中,數(shù)據(jù)庫(kù)系統(tǒng)需要與MainControl進(jìn)程交互,即MainControl進(jìn)程將SQL語(yǔ)句輸入給SQLite,然后由SQLite將輸出結(jié)果發(fā)給MainControl進(jìn)程,并將中間的數(shù)據(jù)操作結(jié)果保存在Flash中。
l
輸入,輸入源為MainControl進(jìn)程,通過(guò)進(jìn)程間通訊實(shí)現(xiàn),傳輸?shù)臄?shù)據(jù)大部分為SQL語(yǔ)句
l
輸出,輸出源為MainControl進(jìn)程,這里的數(shù)據(jù)有時(shí)會(huì)很大,暫時(shí)不考慮進(jìn)程間通訊方式
1.1.5
操作結(jié)果保存在Flash上
將SQLite的數(shù)據(jù)庫(kù)操作結(jié)果保存在flash上有兩種方法,
l
將flash通過(guò)mount的方式掛載到Linux的文件系統(tǒng)上
l
用Flash的驅(qū)動(dòng)接口改寫(xiě)Os_Linux.c下的UnixRead()函數(shù)的實(shí)現(xiàn)方式
這里我們用第一種方法實(shí)現(xiàn),只需把flash mount到文件系統(tǒng)上,并在mount的目錄下建立數(shù)據(jù)庫(kù)文件data.db即可。
1.3
數(shù)據(jù)庫(kù)事務(wù)性能優(yōu)化
通過(guò)查看SQLite數(shù)據(jù)庫(kù)事務(wù)處理的實(shí)現(xiàn),事務(wù)處理模塊對(duì)一個(gè)事務(wù)的最終處理是分解為多個(gè)指令而完成的。那么對(duì)于頻繁操作的事務(wù)而言,數(shù)據(jù)庫(kù)實(shí)現(xiàn)很耗時(shí),可以通過(guò)改變執(zhí)行方式來(lái)優(yōu)化這些處理。在一個(gè)整體事務(wù)開(kāi)始前,通過(guò)sqlite_exec()調(diào)用”BEGIN”命令禁止啟動(dòng)事務(wù)并禁止“自動(dòng)提交”特性。整體事務(wù)完成后,通過(guò)sqlite_exec()調(diào)用”COMMIT”命令進(jìn)行事務(wù)提交并啟用“自動(dòng)提交”特性。
下面是實(shí)現(xiàn)方式的模型,
事務(wù)性能的優(yōu)化
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 事務(wù)性能的優(yōu)化
本文來(lái)自ChinaUnix博客,如果查看原文請(qǐng)點(diǎn):http://blog.chinaunix.net/u2/70351/showart_1003351.html |
|