From 1235ea5bb546677d34cb86d96ae7da68d2097b8f Mon Sep 17 00:00:00 2001 From: Nick Farrell Date: Mon, 12 Dec 2022 13:39:02 +1100 Subject: [PATCH] Use prepared statement for bulk writes When executing the same statement multiple times, avoid the overhead of re-parsing the statement for each insert. --- server/message_cache.go | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/server/message_cache.go b/server/message_cache.go index 3972470b..95edd980 100644 --- a/server/message_cache.go +++ b/server/message_cache.go @@ -258,12 +258,23 @@ func (c *messageCache) addMessages(ms []*message) error { if c.nop { return nil } + if len(ms) == 0 { + return nil + } start := time.Now() tx, err := c.db.Begin() if err != nil { return err } defer tx.Rollback() + statement, err := tx.Prepare( + insertMessageQuery, + ) + if err != nil { + return err + } + defer statement.Close() + for _, m := range ms { if m.Event != messageEvent { return errUnexpectedMessageType @@ -291,8 +302,7 @@ func (c *messageCache) addMessages(ms []*message) error { if m.Sender.IsValid() { sender = m.Sender.String() } - _, err := tx.Exec( - insertMessageQuery, + _, err := statement.Exec( m.ID, m.Time, m.Topic,