Почему этот простой оператор go sqlite иногда занимает 5 секунд?
Это небольшое приложение для чата. Вот функция:
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 db. БД сейчас очень мала, таблица сообщений содержит около 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