Qt5.4 在 Ubuntu14.04 64位上使用 QSqlDatabase sqlite3 :
首先,我打开并在数据库上调用String path = file.getPath().substring(installFilesLocationOnDisk.length());
exportResource("/" + path.replace(File.pathSeparatorChar, '/'));
。
接下来,我制作了54个单独的插入查询,每个查询都准备好了,每个查询都在执行后删除。
最后我致电transaction()
。
所有调用完成且没有错误,但执行时间仍然很糟糕(54个普通插件总共约500毫秒)。
我的电脑相当现代,并且具有条纹SSD磁盘以提高性能。使用Sqliteman访问sqlite文件时速度非常快。
那么发生了什么?
这是插入内容:
commit()
更新:根据要求,这是open():
void BottleRigStorage::upsertTag(Tag &tag){
//ScopedTimer st("query time for tag");
if(open()){
QSqlQuery query(db);
query.prepare("INSERT OR REPLACE INTO tags ("
" id"
", batchID"
", retries"
", good"
", status"
", color"
", firstCheckTimestamp"
", createdTimestamp"
", modifiedTimestamp"
", fulfilledTimestamp"
") VALUES ("
" :id"
", :batchID"
", :retries"
", :good"
", :status"
", :color"
", :firstCheckTimestamp"
", :createdTimestamp"
", :modifiedTimestamp"
", :fulfilledTimestamp"
");");
query.bindValue(":id", tag.id);//8 chars
query.bindValue(":batchID", tag.batchID);//8 chars
query.bindValue(":retries", tag.retries);//int
query.bindValue(":good",tag.good?1:0);//bool
query.bindValue(":status", tag.status);//6 chars
query.bindValue(":color", tag.color);//7 chars
query.bindValue(":firstCheckTimestamp", tag.firstCheckTimestamp); //long
query.bindValue(":createdTimestamp", tag.createdTimestamp);//long
query.bindValue(":modifiedTimestamp", tag.modifiedTimestamp);//long
query.bindValue(":fulfilledTimestamp", tag.fulfilledTimestamp);//long
if (query.exec()) {
//qDebug() << "Successfully updated tag database after "<<st.getIntervalCompleteString();
}
else {
qWarning() << "ERROR: could not upsert tag with id " << tag.id<< ". Reason: "<< query.lastError();
}
query.finish();
}
else {
qWarning() << "ERROR: DB not open for upsert tag sqlite3";
}
}
答案 0 :(得分:4)
仅使用一次准备。您的代码正准备查询每个 QSqlQuery创建后的时间。你需要创造 QSqlQuery在准备函数之外,只是使用值 函数中绑定和sql查询exec:
void BottleRigStorage::upsertTag(Tag &tag){
//ScopedTimer st("query time for tag");
if(open()){
query.bindValue(":id", tag.id);//8 chars
query.bindValue(":batchID", tag.batchID);//8 chars
query.bindValue(":retries", tag.retries);//int
query.bindValue(":good",tag.good?1:0);//bool
query.bindValue(":status", tag.status);//6 chars
query.bindValue(":color", tag.color);//7 chars
query.bindValue(":firstCheckTimestamp", tag.firstCheckTimestamp); //long
query.bindValue(":createdTimestamp", tag.createdTimestamp);//long
query.bindValue(":modifiedTimestamp", tag.modifiedTimestamp);//long
query.bindValue(":fulfilledTimestamp", tag.fulfilledTimestamp);//long
if (query.exec()) {
//qDebug() << "Successfully updated tag database after "<<st.getIntervalCompleteString();
}
else {
qWarning() << "ERROR: could not upsert tag with id " << tag.id<< ". Reason: "<< query.lastError();
}
query.finish();
}
else {
qWarning() << "ERROR: DB not open for upsert tag sqlite3";
}
}
在这种情况下,查询对象可以是私有成员,例如,在数据库初始化之后创建。
您可以通过编译指示调整sqlite数据库。例如,下一个代码将增加查询的执行:
m_pDatabase-&gt; exec(“PRAGMA synchronous = OFF”); m_pDatabase-&gt; exec(“PRAGMA journal_mode = MEMORY”);
有关此内容的更多信息,您可以重新here
答案 1 :(得分:0)
当我有99个程序时,我遇到了同样的问题,每个人都有99个步骤,我从Pendrive读取数据并从CSV文件中插入数据库。它花了超过5分钟,但在那之后,我做了很少的改变
<强>的main.cpp 强>
db.open();
db.exec("PRAGMA synchronous = OFF");
db.exec("PRAGMA journal_mode = MEMORY");
并在插入查询的类上添加了db commit
<强> model.cpp 强>
qDebug()<<"can start a transaction PrgQuery:"<<QSqlDatabase::database().transaction();
query.prepare("insert query");
query.exec();
qDebug()<<"end transaction Step Query:"<<QSqlDatabase::database().commit();
这解决了我的问题,并将时间缩短为10秒。非常快就像无限的力量