我在C ++中使用SQLite3,我发现第一次sqlite的开放时间似乎不稳定(我指的是第一次打开windows并打开db的时间)。 50M db需要很长时间,窗口需要10s左右,并且在不同时间会有所不同。
有没有人遇到同样的问题?
我正在Windows中编写桌面应用程序,因此开启速度对我来说非常重要。 提前致谢
void OpenDB(const CString& strPath)
{
int nRet;
#if defined(_UNICODE) || defined(UNICODE)
nRet = sqlite3_open16(szFile, &mpDB); // not tested under window 98
#else // For Ansi Version
//****- Added by Begemot szFile must be in unicode- 23/03/06 11:04 - ****
OSVERSIONINFOEX osvi;
ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
GetVersionEx((OSVERSIONINFO *) &osvi);
if ( osvi.dwMajorVersion == 5)
{
WCHAR pMultiByteStr[MAX_PATH+1];
MultiByteToWideChar( CP_ACP, 0, szFile,
_tcslen(szFile)+1, pMultiByteStr,
sizeof(pMultiByteStr)/sizeof(pMultiByteStr[0]) );
nRet = sqlite3_open16(pMultiByteStr, &mpDB);
}
else
nRet = sqlite3_open(szFile,&mpDB);
#endif
//*************************
if (nRet != SQLITE_OK)
{
LPCTSTR szError = (LPCTSTR) _sqlite3_errmsg(mpDB);
throw CppSQLite3Exception(nRet, (LPTSTR)szError, DONT_DELETE_MSG);
}
setBusyTimeout(mnBusyTimeoutMs);
}
起初,我认为这是一个缓存问题,我认为这是因为sqlite随机访问磁盘上的索引,导致第一次启动这么长时间(重启windows)。所以我在它之前添加了以下代码:
BOOL CQFilePro::PreLoad(const CString& strPath)
{
boost::shared_array<BYTE> temp = boost::shared_array<BYTE>(new BYTE[PRE_LOAD_BUFFER_LENGTH]);
int nReadLength;
try {
CFile file;
if (file.Open(strPath, CFile::modeRead) == FALSE)
{
return FALSE;
}
do {
nReadLength = file.Read(temp.get(), PRE_LOAD_BUFFER_LENGTH);
} while (nReadLength == PRE_LOAD_BUFFER_LENGTH);
file.Close();
}
catch(...) {
}
return TRUE;
}
CString strDBPath = _T("XXXX");
preload(strDBPath);
Opendb(strDBPath);
但是这段代码没什么区别。
答案 0 :(得分:1)
因为你的问题是“有没有人遇到同样的问题?”我的简短回答是“不,我没有。”
但更具体一点,正如Snake建议的那样,如果您认为数据库的加载时间很长并且这可能会以某种方式干扰用户体验,那么应该设置一些通知框,表示加载正在进行中。
大多数用户甚至不会认为这很烦人,只要他们掌握有关正在发生的事情的信息。
更新
你的最后一条评论指出,第二次打开它所需的时间要少得多(据说也是第三次)。这可能与您的硬盘驱动器缓存系统有关。有时会通过将常用文件保存在某些快速访问的内存中而不是从磁盘中读取它们来加快常用文件的加载(这很慢)。
答案 1 :(得分:0)
SQLite将数据存储在分页树中。只需打开连接而不执行任何查询,就不应触发任何(大量)数据加载。
也许正在发生其他事情。您可以使用Process Monitor查看在调用open时是否有其他进程(即防病毒?)正在访问您的数据库文件。