Я занимаюсь разработкой оконного приложения для онлайн-редактирования текста для своего университетского класса и хочу внедрить систему редактирования документов (каждый раз, когда пользователь добавляет или удаляет текст, я сохраняю это событие, чтобы при необходимости выполнить резервное копирование на определенный момент времени),Сначала я попытался сохранить его в таблице базы данных Sqlite прямо на спотовом сервере, получив сигнал от клиента.Но это решение слишком сильно замораживало производительность, даже экономия раз в секунду не слишком помогала.
Я понял, что один вызов QSqlQuery :: exec () занимает 100-200 мс времени.Я в полном отчаянии и не знаю лучшей альтернативы.Любая рекомендация будет полностью полезной.Код, который я использую, указан ниже.
class QueryInsertInto{
QString m_queryString;
public:
QueryInsertInto(const char * const & tableName,
const std::initializer_list<const char *> & columns,
const size_t & totalValues = 1)
: m_queryString(QString("INSERT INTO %1 (").arg(tableName)){
Qext::String::appendCommaSeparatedList(m_queryString, columns);
m_queryString += ") VALUES ";
QString valueTemplate = "(";
Qext::String::appendCommaSeparatedValue(
valueTemplate, columns.size(), "?"
);
valueTemplate += ')';
Qext::String::appendCommaSeparatedValue(
m_queryString, totalValues, valueTemplate
);
m_queryString += ';';
}
template <typename TQVariantsContainer>
QSqlQuery tryExecQuery(const QSqlDatabase & db, TQVariantsContainer && values);
QSqlQuery tryExecQuery(const QSqlDatabase & db,
const std::initializer_list<QVariant> & values);
};
template<typename TQVariantsContainer>
QSqlQuery QueryInsertInto::tryExecQuery(const QSqlDatabase & db,
TQVariantsContainer && values){
QSqlQuery query(db);
if (!query.prepare(m_queryString)){
throw MessageException(
QString("query prepare failure (%1)")
.arg(query.lastError().text()).toStdString()
);
}
for (const auto & value : values){
query.addBindValue(value);
}
QTime time;
time.start();
if (!query.exec()){
throw MessageException(
QString("query exec failure (%1)")
.arg(query.lastError().text()).toStdString()
);
}
int elapsed { time.elapsed() };
QLOG("query exec elapsed ms-> " << elapsed); // reports 100-200 ms
return query;
}