QT创建者+SQLite.插入速度非常慢

QT Creator + SQLite. Insert Very slow

本文关键字:非常 速度 插入 创建者 +SQLite QT      更新时间:2023-10-16

我制作了一个在Windows 32位中运行的小型终端应用程序。

此应用程序从UDP端口侦听并在SQLite数据库上写入数据

代码:

#include <QUdpSocket>
#include <QTextStream>
#include <QSqlDriver>
#include <QSqlDatabase>
#include <QSqlQuery>

int main()
{
    int i;
    QTextStream qout(stdout);
    //db conn or create db
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setHostName("localhost");
    db.setDatabaseName("C:\db_test\db.sqlite");
    db.open();
    //create db structure
    QSqlQuery *query = new QSqlQuery(db);
    query->prepare("CREATE TABLE "
                   "MYTABLE("
                   "FIELD_1 VARCHAR(100) NOT NULL, "
                   "FIELD_2 VARCHAR(100) NOT NULL)"
                   );
    if(query->exec() == true){
        qout << "New Database Created" << endl;
    } else {
        qout <<"Database Alredy Exists" << endl;
    }

   //start UDP listener
    QUdpSocket *udpSocket = new QUdpSocket(0);
    udpSocket->bind(7755, QUdpSocket::ShareAddress);
    i=1;
    while (udpSocket->waitForReadyRead(-1)) {
        while(udpSocket->hasPendingDatagrams()) {
            QByteArray datagram;
            datagram.resize(udpSocket->pendingDatagramSize());
            QHostAddress sender;
            quint16 senderPort;
            udpSocket->readDatagram(datagram.data(), datagram.size(),
                                    &sender, &senderPort);
            QString Rec_Data = datagram.data();
            QString Sender_Address = sender.toString();
            QString InsertStr = "INSERT INTO MYTABLE VALUES (:val1, :val2)";
            qout << InsertStr << " " << i << endl;
            query->prepare(InsertStr);
            query->bindValue(":val1", Rec_Data);
            query->bindValue(":val2", Sender_Address);
            if(query->exec() == true){
                qout << "Data stored" << endl;
            } else {
                qout <<"Store Error" << endl;
            }
            i=i+1;
        }
    }
}

我每分钟需要处理大约20000个查询,但当我运行(Ctrl+R)时,它每分钟处理大约500个查询。

我知道出了什么问题,但我不知道是什么。

将多个INSERT操作批处理到单个事务中。

单独执行插入操作会将吞吐量限制在每秒60次左右,因为当SQLite进行写后读取验证时,硬盘驱动器磁盘必须完全旋转。

进一步阅读
INSERT真的很慢-我每秒只能执行几十次INSERT