kiwi 新增支持sqlite3特性
官网
http://www.sqlite.org/
版本
sqlite-autoconf-3071602.tar.gz(3.7.16.2)
compile for win32
修改sqlite3.c,将SQLITE_API宏定义为__declspec(dllexport)
#ifndef SQLITE_API
# define SQLITE_API __declspec(dllexport)
#endif
compile for linux
#cd /vendor/sqlite3/sqlite-autoconf-3071602
#./configure CFLAGS=-DSQLITE_THREADSAFE=2
#make
编译后会在当前目录下生成一个隐藏目录.libs,库文件就在此目录下
线程安全模式
单线程:禁用所有的mutex锁,并发使用时会出错。当SQLite编译时加了SQLITE_THREADSAFE=0参数,或者在初始化SQLite前调用sqlite3_config(SQLITE_CONFIG_SINGLETHREAD)时启用。
多线程:只要一个数据库连接不被多个线程同时使用就是安全的。源码中是启用bCoreMutex,禁用bFullMutex。实际上就是禁用数据库连接和prepared statement(准备好的语句)上的锁,因此不能在多个线程中并发使用同一个数据库连接或prepared statement。当SQLite编译时加了SQLITE_THREADSAFE=2参数时默认启用。若SQLITE_THREADSAFE不为0,可以在初始化SQLite前,调用sqlite3_config(SQLITE_CONFIG_MULTITHREAD)启用;或者在创建数据库连接时,设置SQLITE_OPEN_NOMUTEX flag。
串行:启用所有的锁,包括bCoreMutex和bFullMutex。因为数据库连接和prepared statement都已加锁,所以多线程使用这些对象时没法并发,也就变成串行了。当SQLite编译时加了SQLITE_THREADSAFE=1参数时默认启用。若SQLITE_THREADSAFE不为0,可以在初始化SQLite前,调用sqlite3_config(SQLITE_CONFIG_SERIALIZED)启用;或者在创建数据库连接时,设置SQLITE_OPEN_FULLMUTEX flag。
参考:
1)http://www.keakon.net/2011/10/25/SQLite%E5%9C%A8%E5%A4%9A%E7%BA%BF%E7%A8%8B%E7%8E%AF%E5%A2%83%E4%B8%8B%E7%9A%84%E5%BA%94%E7%94%A8
2)sqlite-doc-3071602里面的compile.html
如何使用
db.conf
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<config>
<trace level="1"></trace>
<dbcpool>
<dbcp name="laton" dba="sqliteapi" encoding="utf-8" dbms="sqlite" count="10" autoreconn="true" connstring="data/user.db"/>
</dbcpool>
</config>
注意:
dbms属性设置为sqlite
connstring属性设置数据库文件的路径
官网
http://www.sqlite.org/
版本
sqlite-autoconf-3071602.tar.gz(3.7.16.2)
compile for win32
修改sqlite3.c,将SQLITE_API宏定义为__declspec(dllexport)
#ifndef SQLITE_API
# define SQLITE_API __declspec(dllexport)
#endif
compile for linux
#cd /vendor/sqlite3/sqlite-autoconf-3071602
#./configure CFLAGS=-DSQLITE_THREADSAFE=2
#make
编译后会在当前目录下生成一个隐藏目录.libs,库文件就在此目录下
线程安全模式
单线程:禁用所有的mutex锁,并发使用时会出错。当SQLite编译时加了SQLITE_THREADSAFE=0参数,或者在初始化SQLite前调用sqlite3_config(SQLITE_CONFIG_SINGLETHREAD)时启用。
多线程:只要一个数据库连接不被多个线程同时使用就是安全的。源码中是启用bCoreMutex,禁用bFullMutex。实际上就是禁用数据库连接和prepared statement(准备好的语句)上的锁,因此不能在多个线程中并发使用同一个数据库连接或prepared statement。当SQLite编译时加了SQLITE_THREADSAFE=2参数时默认启用。若SQLITE_THREADSAFE不为0,可以在初始化SQLite前,调用sqlite3_config(SQLITE_CONFIG_MULTITHREAD)启用;或者在创建数据库连接时,设置SQLITE_OPEN_NOMUTEX flag。
串行:启用所有的锁,包括bCoreMutex和bFullMutex。因为数据库连接和prepared statement都已加锁,所以多线程使用这些对象时没法并发,也就变成串行了。当SQLite编译时加了SQLITE_THREADSAFE=1参数时默认启用。若SQLITE_THREADSAFE不为0,可以在初始化SQLite前,调用sqlite3_config(SQLITE_CONFIG_SERIALIZED)启用;或者在创建数据库连接时,设置SQLITE_OPEN_FULLMUTEX flag。
参考:
1)http://www.keakon.net/2011/10/25/SQLite%E5%9C%A8%E5%A4%9A%E7%BA%BF%E7%A8%8B%E7%8E%AF%E5%A2%83%E4%B8%8B%E7%9A%84%E5%BA%94%E7%94%A8
2)sqlite-doc-3071602里面的compile.html
如何使用
db.conf
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<config>
<trace level="1"></trace>
<dbcpool>
<dbcp name="laton" dba="sqliteapi" encoding="utf-8" dbms="sqlite" count="10" autoreconn="true" connstring="data/user.db"/>
</dbcpool>
</config>
注意:
dbms属性设置为sqlite
connstring属性设置数据库文件的路径