Как можно повторно использовать соединение с базой данных в Golang облачных функциях? - PullRequest
0 голосов
/ 20 апреля 2020

В настоящее время я пытаюсь перенести свое приложение в облачные функции IBM, но одна проблема, с которой я сталкиваюсь, заключается в том, чтобы не допустить повторного подключения БД Postgresql при каждом вызове действия.

Я нашел очень небольшая информация о том, как повторно использовать соединение с БД в Go, и о решениях, которые я пробовал (сохранение обработчика базы данных в глобальной переменной), не работает.

Кто-нибудь сможет указать мне на право do c?

Спасибо,

-Thomas

PS: Вот фрагмент кода, который иллюстрирует, как я пытался:

func Storage() Storager {
    once.Do(func() {
        db := InitDB()
        println("Initiating DB...")
        s = &storage{
            db: db,
        }
    })

    return s
}

// This is declared as a global variable in main
var s = storage.Storage()

1 Ответ

1 голос
/ 21 апреля 2020

Можно сохранить глобальное состояние внутри действий OpenWhisk, и это работает для Golang функций. Например, вот функция counter.go, которая увеличивает глобальный счетчик для каждого вызова функции.

package main

var counter = 1

func Main(args map[string]interface{}) map[string]interface{} {
  msg := make(map[string]interface{})
  msg["counter"] = counter
  counter = counter + 1
  return msg
}

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

> wsk action create counter counter.go
> wsk action invoke counter --result
{
  "counter": 1
}
> wsk action invoke counter --result
{
  "counter": 2
}
> wsk action invoke counter --result
{
  "counter": 3
}

Так что то, что вы пытаетесь сделать, должно работать. В вашем примере убедитесь, что действие завершается успешно, а не выдает ошибку и происходит сбой (что предотвращает дальнейшее повторное использование). Кроме того, проверьте запись активации, чтобы увидеть, была ли активация теплой или холодной. Это можно увидеть, проверив, есть ли в записи активации аннотация initTime, указывающая на холодный запуск. Если нет, активация активна, и новейшая активация выполнялась в том же контексте, что и предыдущая активация.

...