На самом деле, я не думаю, что это будет проблема с кэшированием. Я почти уверен, что SQLite не загружает всю базу данных в память при ее открытии - он просто получает относительно небольшое количество структур на диске.
Одна из возможностей, однако, заключается в том, что он не был скомпилирован с определением препроцессора SQLITE_OMIT_AUTOINIT
. В этом случае вызов sqlite3_open16
приведет к вызову sqlite3_initialize()
.
В этой функции происходит довольно много, хотя я не уверен, сколько времени это займет. Функция sqlite3_initialize()
поддерживает флаг, указывающий, что он был вызван ранее, а затем при последующих вызовах он будет (почти) немедленно завершен. Вот почему я упоминаю это как возможного виновника в разнице между первым и последующим открытием.
Я бы предложил изменить ваш код с:
sqlite3* mpDB;
nRet = sqlite3_open16(szFile, &mpDB);
до:
sqlite3* mpDB;
nRet = sqlite3_initialize();
if (nRet == SQLITE_OK)
nRet = sqlite3_open16(szFile, &mpDB);
и синхронизацию двух вызовов функций независимо. Может быть, это инициализация, занимающая время.