> If a statment finished with sqlite3_step, but not closed so I can reuse it late. In this case that mean a long-running readers block prevent a checkpointer? If sqlite3_reset is called on the statement either explicitly or implicitly then the statement is no longer executing -- it is completed. If the last call to sqlite3_step returned SQLITE_ROW then the statement is still executing and the checkpoint operation cannot checkpoint changes subsequent to the start of that transaction to the database. > If i want to do checkpoint in other thread and write in main thread, I has to create 2 connection for the same database in single thread mode? You cannot have more than one thread call into the sqlite3 library (simultaneously) when in single-thread mode.