On Fri, Apr 24, 2009 at 5:27 AM, John Stanton <jo...@viacognis.com> wrote: > Sqlte provides COMMIT and ROLLBACK unlike Berkeley. If you can get by > without the advanced features of Sqlite, then use Berkely and take > advantage of its simplicity and faster execution.
BDB does support transactions... http://www.oracle.com/technology/documentation/berkeley-db/xml/gsg_xml_txn/cxx/usingtxns.html In fact, BDB acts as the (a) transactional layer in MySQL (the alternative is InnoDB). Of course, other advantages of SQLite still apply. A key-value metaphor can only be pushed so far. > > Note that for best performance an Sqlite application should group > database inserts, deletes and updates into transactions. > > liubin liu wrote: >> our project is using sqlite3, but found that the speed is too slow. >> I just tested the BerkeleyDB, and found that the speed is very fast. But I >> knew the sqlite3 is fast enough. And so I'm confused. >> I may be using sqlite3 in wrong way? >> >> anyway, next is my test code. I'm glad to receive your message. >> >> ______________________________________________________________________________ >> >> >> // http://www.ibm.com/developerworks/cn/linux/l-embdb/ >> >> ////////////////////////////// head /////////////////////////////// >> #include <stdio.h> >> #include <stdlib.h> // for system >> #include <string.h> // for memset strcpy >> #include <time.h> // for time >> >> #include <sqlite3.h> // for Sqlite3 >> #include <db.h> // for Berkeley DB >> >> >> >> //////////////////////////// macro and struct >> ///////////////////////////// >> #define DB_FILE_SQLITE "test_sqlite_0.1.db" >> #define DB_FILE_BDB "test_bdb_0.1.db" >> >> struct customer >> { >> int c_id; >> char name[10]; >> char address[20]; >> int age; >> }; >> >> >> >> >> >> >> ////////////////////////////// global variable >> /////////////////////////////// >> >> sqlite3 *db = NULL; >> >> int ret = -1; // 各函数返回值 >> >> >> >> >> >> >> >> ////////////////////////////// func proto >> /////////////////////////////// >> >> void way01(); // 打开、关闭的影响 >> >> >> >> ///////// sqlite3 ////////// >> >> int sqlite_createtb(sqlite3 *db); >> int sqlite_insertdb(sqlite3 *db); >> >> int getdata_sqlite ( sqlite3 *db, struct customer *tb1 ); >> >> >> >> /////// berkeley db //////// >> >> int bdb_createdb(); // 包含了插入数据 >> >> void print_error(int r); >> void init_dbt( DBT *key, DBT *data ); >> >> >> >> >> >> >> /////////////////////////////// code /////////////////////////////// >> >> int main ( void ) >> { >> int c = 0; >> >> system ( "rm -rf test_0.1.db" ); >> ret = sqlite3_open ( DB_FILE_SQLITE, &db ); >> ret = sqlite_createtb(db); >> ret = sqlite_insertdb(db); >> sqlite3_close (db); >> >> printf ( "Sqlite3 / Berkeley DB, 创建数据库 + 插入数据 ... 完成\n" ); >> >> printf ( "/////////////////////////////////////////////////\n" ); >> printf ( "1 : 查询性能比较 - Berkeley DB 与 Sqlite3 ///\n" ); >> >> while ( (c=getchar()) != 'q' ) >> { >> switch (c) >> { >> case '1': >> way01(); >> break; >> default: >> break; >> } >> } >> >> system ( "rm -rf test_sqlite_0.1.db" ); >> system ( "rm -rf test_bdb_0.1.db" ); >> >> return 0; >> } >> >> /////////////////////////////////////////////////////////////// >> // 查询性能比较 - Berkeley DB 与 Sqlite3 >> void way01() >> { >> time_t tick1, tick2; >> >> int i = 0; >> int num = 1000*100; >> >> struct customer tb_data; >> >> /////////////////////////////////////////////////////////// >> time ( &tick1 ); >> for ( i=0; i<num; i++ ) >> { >> ret = sqlite3_open ( DB_FILE_SQLITE, &db ); >> ret = getdata_sqlite ( db, &tb_data ); >> sqlite3_close (db); >> } >> time ( &tick2 ); >> printf("Sqlite3 : 打开、关闭并操作数据库文件 %d 次, 时间为: %4ld s\n", num, tick2 - >> tick1 ); >> >> /////////////////////////////////////////////////////////// >> bdb_createdb(); >> } >> >> >> >> >> >> >> >> /////////////////////////////////////////////////////////////// >> void *callback(void *para, int col, char **value, char **colname ) >> { >> // int i; >> // for(i=0; i<col; i++){ >> // printf("%s, ", (value[i] ? value[i] : "NULL") ); >> // } >> // printf("col = %d\n", col); >> return (void *) 0; >> } >> int getdata_sqlite ( sqlite3 *db, struct customer *tb1 ) >> { >> char *sql = "SELECT * FROM table1 WHERE id=500;"; >> ret = sqlite3_exec ( db, sql, (void *)callback, NULL, NULL ); >> return 0; >> } >> >> /////////////////////////////////////////////////////////////// >> int sqlite_createtb( sqlite3 *db ) >> { >> char *sql1 = "CREATE TABLE table1 (id INTEGER, name VARCHAR(10), >> address >> VARCHAR(20), age INTEGER)"; >> ret = sqlite3_exec ( db, sql1, NULL, NULL, NULL ); >> return 0; >> } >> int sqlite_insertdb(sqlite3 *db) >> { >> time_t tick1, tick2; >> int i = 0; >> int num = 1000; >> >> char *qf = "INSERT INTO table1 VALUES (%d, %Q, %Q, %d)"; >> char *sql = NULL; >> >> time ( &tick1 ); >> sqlite3_exec ( db, "BEGIN", NULL, NULL, NULL ); >> for (i=0;i<num;i++) >> { >> sql = sqlite3_mprintf ( qf, i, "javer", "chengdu", 32*i ); >> ret = sqlite3_exec(db, sql, NULL, NULL, NULL); >> sqlite3_free (sql); >> } >> sqlite3_exec(db,"COMMIT",NULL,NULL,NULL); >> time ( &tick2 ); >> >> return 0; >> } >> >> >> >> >> >> /////////////////////////////////////////////////////////////// >> int bdb_createdb() >> { >> time_t tick1, tick2; >> int i = 0; >> int num = 1000; >> int key_cust_c_id = 500; >> >> DB *dbp; >> DBT key, data; >> struct customer cust; >> >> >> ret = db_create(&dbp, NULL, 0); >> ret = dbp->open(dbp, NULL, DB_FILE_BDB, NULL, DB_BTREE, DB_CREATE, >> 0664); >> >> time ( &tick1 ); >> for ( i=0; i<num; i++ ) >> { >> cust.c_id = i; >> strncpy(cust.name, "javer", 9); >> strncpy(cust.address, "chengdu", 19); >> cust.age = 32*i; >> >> init_dbt( &key, &data ); >> >> key.size = sizeof(int); >> key.data = &(cust.c_id); >> >> data.size = sizeof(struct customer); >> data.data = &cust; >> >> ret = dbp->put(dbp, NULL, &key, &data,DB_NOOVERWRITE); >> print_error(ret); >> } >> time ( &tick2 ); >> //printf ( "Berkeley DB 打开+插入+关闭, 耗时: %ld s\n", tick2-tick1 ); >> >> >> printf("Berkeley DB : 插入完成\n"); >> time ( &tick1 ); >> for ( i=0; i<num*10000; i++ ) >> { >> init_dbt( &key, &data ); >> >> key.size = sizeof(int); >> key.data = &key_cust_c_id; >> >> memset(&cust, 0, sizeof(struct customer)); >> >> data.data = &cust; >> data.ulen = sizeof(struct customer); >> data.flags = DB_DBT_USERMEM; >> >> ret = dbp->get(dbp, NULL, &key, &data, 0); >> print_error(ret); >> >> // printf("c_id = %d, name = %s, address = %s, age = %d.\n", >> // cust.c_id, cust.name, cust.address, cust.age); >> } >> time ( &tick2 ); >> printf("Berkeley DB : 打开、关闭并操作数据库文件 %d 次, 时间为: %4ld s\n", num, tick2 - >> tick1 ); >> >> if(dbp != NULL) >> dbp->close(dbp, 0); >> >> return 0; >> } >> // 数据结构DBT在使用前,应首先初始化,否则编译可通过但运行时报参数错误 >> void init_dbt( DBT *key, DBT *data ) >> { >> memset(key, 0, sizeof(DBT)); >> memset(data, 0, sizeof(DBT)); >> } >> // DB的函数执行完成后,返回0代表成功,否则失败 >> void print_error(int r) >> { >> if(r != 0) >> printf("ERROR: %s\n",db_strerror(r)); >> } >> >> > > _______________________________________________ > sqlite-users mailing list > sqlite-users@sqlite.org > http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users > -- Puneet Kishor http://www.punkish.org/ Carbon Model http://carbonmodel.org/ Charter Member, Open Source Geospatial Foundation http://www.osgeo.org/ Science Commons Fellow, Geospatial Data http://sciencecommons.org Nelson Institute, UW-Madison http://www.nelson.wisc.edu/ ----------------------------------------------------------------------- collaborate, communicate, compete ======================================================================= _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users