C ++ Qt, один запрос SQL INSERT занимает слишком много времени - PullRequest
0 голосов
/ 08 июня 2018

Я занимаюсь разработкой оконного приложения для онлайн-редактирования текста для своего университетского класса и хочу внедрить систему редактирования документов (каждый раз, когда пользователь добавляет или удаляет текст, я сохраняю это событие, чтобы при необходимости выполнить резервное копирование на определенный момент времени),Сначала я попытался сохранить его в таблице базы данных 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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...