sql.Open() возвращает переменную типа *sql.DB
У меня есть функция, которая вызывает 10 других функций, которые все должны выполнять вызовы базы данных.
Является ли более правильным/эффективным:
- Отправьте указатель *sql.DB на каждую функцию или
- Создайте новый объект *sql.DB в каждой функции.
Значение
func DoLotsOfThings() {
db, _ := sql.Open()
defer db.Close()
DoTask1(db)
DoTask2(db)
}
or
func DoLotsOfThings() {
DoTask1()
DoTask2()
}
func DoTask1() {
db, _ := sql.Open()
defer db.Close()
}
func DoTask1() {
db, _ := sql.Open()
defer db.Close()
}
Причина, по которой я спрашиваю, заключается в том, что в настоящее время я отправляю указатель на каждую функцию, и мой драйвер, похоже, ломается. Я использую http://code.google.com/p/odbc , что наводит меня на мысль, что каждая функция должна есть своя, и что я могу положиться на водительское нутро.
ИЗМЕНИТЬ
Поломка драйвера RE, это происходит только в условиях высокой нагрузки. И это происходит только после, скажем, десяти минут или около того времени. Это наводит меня на мысль, что существует какая-то утечка памяти, из-за которой использование драйвера перестает работать. Однако я откладываю db.Close() для каждого экземпляра *sql.DB, поэтому я не знаю, что еще я могу сделать, чтобы решить эту проблему.
andybalholm говорит, что пул соединений обрабатывается внутри, что кажется точным, потому что он прерывается только после того, как я пытаюсь что-то выполнить, а не когда я вызываю sql.Open()
Если я оставлю свое приложение Go запущенным, оно не сможет выполнять какие-либо SQL-запросы, но если я попытаюсь запустить другие тесты Go отдельно, подключившись к MSSQL и выполняя запросы, это сработает.