0

最近在做Sqlite3的性能测试:

测试一:

首先建立一个数据库;

创建一个表格:

开始循环

{

向数据库里面插入1000数据;

sleep(五秒)

删除所有数据;

sleep(五秒)

}

通过程序的CPU占用和内存使用来判断性能。

在测试过程中发现了sqlite的插入时间很久,于是我查了查资料:

原因:它以文件的形式存在磁盘中,每次访问时都要打开一次文件,如果对数据库进行大量的操作,就很慢。

解决办法:用事物的形式提交,因为开始事务后,进行的大量操作语句都保存在内存中,当提交时才全部写入数据库,此时,数据库文件也只用打开一次。如果操作错误,还可以回滚事务。

接口:事务的操作没有特别的接口函数,就是一个普通的 sql 语句而已,分别如下:

begin transaction --- 开始一个事务

commit transaction --- 提交事务

rollback transaction --- 回滚事务

在插入1000条记录前后分别使用:begin transaction 和 commit transaction 

发现速度果然上去了。原来插入1000条需要几十秒;修改后只需要不到1秒。

想想也是,原先进行了1000次的打开文件、写文件、关闭文件的操作费时费力也是正常的。


注意事项二:

关于sqlite3的内存泄露问题。

1. 在使用
sqlite3_get_table(
  sqlite3 *db,          /* An open database */
  const char *zSql,     /* SQL to be evaluated */
  char ***pazResult,    /* Results of the query */
  int *pnRow,           /* Number of result rows written here */
  int *pnColumn,        /* Number of result columns written here */
  char **pzErrmsg       /* Error msg written here */
);
后,要调用   sqlite3_free_table(pazResult) 来释放结果集,防止内存泄露
2. 在使用
sqlite3_exec(
  sqlite3*,                                  /* An open database */
  const char *sql,                           /* SQL to be evaluated */
  int (*callback)(void*,int,char**,char**),  /* Callback function */
  void *,                                    /* 1st argument to callback */
  char **errmsg                              /* Error msg written here */
);
后,要调用 sqlite3_free(*errmsg) 来释放错误信息,防止内存泄露


<1>准备语句(prepared statement)对象

typedef struct sqlite3_stmt sqlite3_stmt;

使用sqlite3_finalize()销毁这个对象

转自:http://blog.csdn.net/cfxks1989/article/details/8259955
关闭 返回顶部
联系我们
Copyright © 2011. 聚财吧. All rights reserved.