加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Sqlite的FAQ学习

发布时间:2020-12-12 23:39:52 所属栏目:百科 来源:网络整理
导读:(7) Can multiple applications or multiple instances of the same application access a single database file at the same time? 这里面提到,sqlite允许多个应用同时操作一个数据库文件,但由于它通过fcntl函数来控制读写锁,因此不能像其它的C/S模式数据库

(7) Can multiple applications or multiple instances of the same application access a single database file at the same time?

这里面提到,sqlite允许多个应用同时操作一个数据库文件,但由于它通过fcntl函数来控制读写锁,因此不能像其它的C/S模式数据库那样(如mysql),即可以同时读也可以同时写,sqlite只允许同一时刻读,如果同一时刻写将返回SQLITE_BUSY.同时还提到了由于fcntl函数在NFS文件系统中并不能始终执行正常,因此请避免在NFS文件系统中使用sqlite.

(8) Is SQLite threadsafe?

Sqlite是线程安全的,通常,为了启用这一功能,Sqlite必须在编译的时候设置THREADSAFE宏为1.缺省的情况下,windows的二进制库文件是以THREADSAFE模式编译的,但linux不是.

Threadsafe在上一章节中提到过两个或多个线程可以同时打开同一个Sqlite数据库,它们可以分别使用sqlite3_open函数返回的数据库句柄,但在多个线程中如果共用一个数据库句柄是非常不安全的.

一个数据库句柄只能被一个线程使用,你决不可以在一个线程中打开数据库,然后把返回的数据库句柄传递到另一个线程中使用,这是因为在很多线程实现如Readhat9中,如果一个线程使用fcntl()函数创建了一个锁,则它不能在其它线程中销毁或修改,因此,由于Sqlite频繁的使用了fcntl这个函数来控制加锁,如果在不同线程中传递数据库句柄,则可能带来越来越多的问题。

或许有很多其它方法可以代替fcntl来实现加锁,但它们都相对复杂或难以测试,因此Sqlite目前不允许在多个线程中共享相同的数据库句柄。

在unix系统下,你不能在fork产生的进程中打开sqlite数据库,这可能会带来未知的问题。

(9) How do I list all tables/indices contained in an SQLite database

sqlite中可以使用.table命令查看数据库中所有表,.schema命令查看数据库中表的详细结构.对于每个数据库都会有一个系统表SQLITE_MASTER,结构如下:

CREATE
  
   
  
  TABLE
  
   sqlite_master (
type
TEXT , // table或者index,表明这是表还是索引.
name
表或索引的名称.
tbl_name
索引的情况下,这个字段表明该索引对应的表名称.
rootpage
INTEGER 存储表或索引创建时的sql语句.
);
而其它临时表将存储在同样结构的SQLITE_TEMP_MASTER表中. (11) What is the maximum size of a VARCHAR in SQLite sqlite的varchar类型对于长度是无限制的. (14) I deleted a lot of data but the database file did not get any smaller. Is this a bug? 当删除数据库中记录时,数据文件并不会变小,而是将这部分使用过的空间记录下来,在下次进行插入操作时利用上.当然也可以使用 VACUUM 命令使数据库将空闲空间释放出来,但这会消耗一定时间,大约0.5S/M. (16) How do I use a string literal that contains an embedded single-quote (') character? 使用两个'进行转义即可.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读