Почему это простое go sqlite утверждение иногда занимает 5 секунд? - PullRequest
1 голос
/ 21 апреля 2020

Это небольшое приложение чата. Вот функция:

var msgsStatement *sql.Stmt
func handleMessages() {
    for {
        msg := <-broadcast
        log.Println(msg)
        start := time.Now().UnixNano()
        msgsStatement.Exec(&msg.Username, &msg.Message, &msg.Timestamp)
        end := time.Now().UnixNano()
        log.Println("Data write takes ", end-start, " nanoseconds.")
        for client := range clients {
            err := client.WriteJSON(msg)
            if err != nil {
                log.Printf("error: %v", err)
                client.Close()
                delete(clients, client)
            }
        }
    }
}

Это может дать вывод на консоль что-то вроде этого:

2020/04/21 19:06:56 {1587467216 user1 1}
2020/04/21 19:06:56 Data write takes  6982800  nanoseconds.
2020/04/21 19:07:24 {1587467244 user2 ff}
2020/04/21 19:07:30 Data write takes  5037668900  nanoseconds.

Как вы можете видеть, первый раз это занимает 6 миллисекунд, но второй раз 5 секунд, что странно для такой маленькой записи данных. Когда это происходит, кажется случайным.

Я использую go -sqlite3 дБ. БД сейчас очень мала, таблица сообщений имеет около 50 строк. Там нет индексов. Это столбцы в БД:

msgsStatement, _ = database.Prepare("CREATE TABLE IF NOT EXISTS messages (id INTEGER PRIMARY KEY, username TEXT, message TEXT, timestamp INTEGER)")

Полный код: https://github.com/mismaah-abdulla/Chatapp-Backend/blob/d70123cb73bfae5c01a3e7605ec254561ce1a749/src/main.go

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...