Use prepared statement for bulk writes

When executing the same statement multiple times, avoid
the overhead of re-parsing the statement for each insert.
This commit is contained in:
Nick Farrell 2022-12-12 13:39:02 +11:00
parent 321ed12663
commit 1235ea5bb5
No known key found for this signature in database
GPG key ID: 740D3A86CF435835

View file

@ -258,12 +258,23 @@ func (c *messageCache) addMessages(ms []*message) error {
if c.nop { if c.nop {
return nil return nil
} }
if len(ms) == 0 {
return nil
}
start := time.Now() start := time.Now()
tx, err := c.db.Begin() tx, err := c.db.Begin()
if err != nil { if err != nil {
return err return err
} }
defer tx.Rollback() defer tx.Rollback()
statement, err := tx.Prepare(
insertMessageQuery,
)
if err != nil {
return err
}
defer statement.Close()
for _, m := range ms { for _, m := range ms {
if m.Event != messageEvent { if m.Event != messageEvent {
return errUnexpectedMessageType return errUnexpectedMessageType
@ -291,8 +302,7 @@ func (c *messageCache) addMessages(ms []*message) error {
if m.Sender.IsValid() { if m.Sender.IsValid() {
sender = m.Sender.String() sender = m.Sender.String()
} }
_, err := tx.Exec( _, err := statement.Exec(
insertMessageQuery,
m.ID, m.ID,
m.Time, m.Time,
m.Topic, m.Topic,