问题描述:
从技术上讲,使用连接对象或游标对象的executemany()方法一次性把多条记录写入SQLite数据库后提交事务,减少数据库文件打开和关闭以及事务提交次数,从而提高整体速度,应优先考虑使用这种方式。
但在某些应用场景下,确实需要写入一条数据之后立即提交事务进行持久化。如果是多用户并发场景,为了避免冲突,应该使用锁来控制用户轮流写入,这样的话并发变为串行就必然会影响整体速度。
为了解决这个问题,可以尝试通过其他技术减少数据库文件打开和关闭的次数,或者利用SQLite数据库自身的事务管理技术来提高速度。那么具体性能提升效果如何呢,下面的代码对四种方式进行了比较,分别为:1)传统技术,多线程通过竞争锁轮流进入临界区,然后连接数据库、写入数据、提交事务并断开数据库连接;2)多线程通过竞争锁轮流进入临界区,然后连接数据库、写入数据、断开数据库连接,利用SQLite数据库自身提供的事务管理机制,用户不显式提交事务;3)多线程共用一个连接对象,每个线程竞争进入临界区然后写入数据并提交事务,整个程序中只打开和连接一次数据库,所有线程全部使用完成之后再断开数据库连接,多个线程写入数据时该连接始终保持有效;4)多线程共用一个连接对象,每个线程竞争进入临界区然后写入数据但不显式提交事务,利用SQLite数据库自身的事务管理机制,整个程序中只连接一次数据库,全部使用完成之后再断开数据库连接,多个线程写入数据时该连接始终保持有效。
演示代码(下载源码):
几次运行结果(时间单位为秒):