http://www.sqlite.org/inmemorydb.html
提到能够创建临时数据库,该数据库将存储在内存中,直到需要文件(如果有的话)。它还会在自动完成时删除该文件。这是通过提供空白数据库名称""
来实现的。
rc = sqlite3_open("", &db);
我尝试使用QSQLDatabase在基于QT4的应用程序中执行此操作
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("");
bool ok = db.open();
导致无法打开数据库。
我知道:memory:
选项,并且在我们的小型数据集应用程序中使用它会快得多。我希望在必要时可以回放到文件中,因为我们可能有一些大型数据集。
我假设允许数据库引擎在必要时缓存到文件将更有效,只需让操作系统页面内存进出。
我愿意接受符合以下要求的替代方案:
更新 在完成一些建议的SQLite性能建议后,我现在在使用文件时具有可接受的性能(TRANSACTIONS!)。
我无法弄清楚如何使用sqlite3的内置临时文件功能。
我试图使用QTemporaryFile,但出于某种原因,他们不会自动删除文档所暗示的方式。我还有一些实验要做。
答案 0 :(得分:1)
TL; DR - NO ,您不能使用Qt将空字符串作为数据库名称提供给sqlite3。 (参见编辑3 )。
原始回答
一种可能性是使用backup option in SQLite作为内存数据库。
但是,由于这听起来像是一个优化问题,因此您应该阅读this SO answer,其中详细介绍了如何加速数据库以及从磁盘上断开它使用PRAGMA synchronous = OFF
和/或PRAGMA journal_mode = MEMORY
。您可能还希望使用PRAGMA cache_size
来限制内存中页面的大小。
编辑1:再次阅读您的问题后,我意识到您要求将溢出数据存储到磁盘,并希望SQLite只管理它,所以我的第一段是没用。
修改2:添加了PRAGMA cache_size
建议。
编辑3:回答问题:
关于SQLite优化的其他SO答案的链接非常有用,但仍然没有回答问题的主要内容。即如何通过QT接口使用sqlite3内置临时文件功能。加文S。
好的,但 的答案是 没有,这就是原因。
如果您查看Qt源代码中的SQLite驱动程序,特别是QSQliteDriver::open
函数,它看起来像this:
/*
SQLite dbs have no user name, passwords, hosts or ports.
just file names.
*/
bool QSQLiteDriver::open(const QString & db, const QString &, const QString &, const QString &, int, const QString &conOpts)
{
if (isOpen())
close();
-> if (db.isEmpty())
-> return false;
bool sharedCache = false;
int openMode = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, timeOut=5000;
QStringList opts=QString(conOpts).remove(QLatin1Char(' ')).split(QLatin1Char(';'));
foreach(const QString &option, opts) {
if (option.startsWith(QLatin1String("QSQLITE_BUSY_TIMEOUT="))) {
bool ok;
int nt = option.mid(21).toInt(&ok);
if (ok)
timeOut = nt;
}
if (option == QLatin1String("QSQLITE_OPEN_READONLY"))
openMode = SQLITE_OPEN_READONLY;
if (option == QLatin1String("QSQLITE_ENABLE_SHARED_CACHE"))
sharedCache = true;
}
sqlite3_enable_shared_cache(sharedCache);
-> if (sqlite3_open_v2(db.toUtf8().constData(), &d->access, openMode, NULL) == SQLITE_OK) {
sqlite3_busy_timeout(d->access, timeOut);
setOpen(true);
setOpenError(false);
return true;
} else {
setLastError(qMakeError(d->access, tr("Error opening database"),
QSqlError::ConnectionError));
setOpenError(true);
return false;
}
}
由于The function sqlite3_open
you are trying to call除非您在该特定代码行上修补Qt驱动程序,否则永远不会使用空字符串作为参数调用