Michael
Anonymous
heavycharged
пул коннектов я имею ввиду sql.DB, там же внутри есть уже пул
heavycharged
короче, где хранить *sql.DB
heavycharged
вот что я хотел узнать)
Aleksey
heavycharged
ну т.е., у меня есть хендлеры, и в них передавать *sql.DB? а чем плохо database.Get().Query() делать?
heavycharged
ну или database.Get() и погнал
Aleksey
Зачем Get? database.DB.Query()
heavycharged
пока sql.Open() поинтер будет нил, и потом будет race condition
Aleksey
Есть init
heavycharged
init блочит же
🎉
Инит лучше не юзать.
Aleksey
Инит, да, плохо. Или заранее, прочитать конфиг, соединение с базой сделать
🎉
Да вон же наверху ссылка, написано криво, но смысл там понятен, там всего два файла.
🎉
И пока прога не проинициализируется, нахрена ей отвечать что-то?
heavycharged
heavycharged
она должна отвечать ошибкой и не копить их, ну или копить пока не треснет
🎉
Нихрена не понял, у тебя нет соединения с базой, нет ничего, но уже есть коннекты?
heavycharged
ну да, люди долбят сайт
🎉
Смотря как сайт стартует, если без бэкенда стартует то хз, так-то пока бэкенд не готов нехер чото делать. Пусть бэкенд сначала стартует, генерит шаблон сайта, подрубается к БД, а потом и обрабатывать запросы можно.
Aleksey
Сперва читаем конфиг, пусть пока долбят, мы их не слушаем. Согласно конфигу соединяемся с базой и т.п. мы никого не слушаем, зачем? Потом поднимаем хттп сервер
Aleksey
Те кто долбят моргнуть не успеют как это всё произойдёт
Aleksey
Или база на марсе?
heavycharged
проблема в том, что если база упала, а перед Go нету ничего (например, Nginx), то сайт будет валяться как труп
heavycharged
нужно отобразить какую-то ошибку
heavycharged
если ставишь вперед nginx
heavycharged
то он копит в пул соединения, если твой сокет или порт начинает отвечать
heavycharged
но тогда пул разростается, вариант с тем чтобы читать конфиг и валятся мертвяком с nginx спереди приемлем.
🎉
Ну дык если упала база, фактически и бэкенд накрылся, тада фронтенд должен ошибку отобразить.
heavycharged
тогда nginx будет отрисовывать ошибки
Aleksey
Какой пул?
Aleksey
Нет базы после старта, отвечай 500
Aleksey
Но коннект уже настроен, он будет реконектиться сам
Andrey
Каждый день удивляюсь предметам спора в этом чате
Aleksey
Я ж ведь даже и не спорил
heavycharged
Вопрос изначально был о том, где хранить *sql.DB. В init() не вариант. Прямой доступ тоже как-то плохо. Что мешает где-то по тупняку сделать db = nil? Делаем Get() возвращающий поинтер на *sql.DB и connect() который коннектится к базе и подменяет поинтер через atomic.SwapPointer, чтобы гонки не было. Или я не прав?
Aleksey
Это даже лучше не слушать пока все инициализации не пройдут. Человек открывает страницу, а у него полосочка загрузки начинает медленно передвигаться, он не уходит пока у тебя приложуха стартует, секунд 20 ждёт, энжи также делает прежде чем 500 отдать. Потом у тебя запустился сервер и всем отдал инфу. А если ты сразу всем отдашь 500, а потом начнёшь конфиг читать, не все вернутся потом за инфой. Да и порт на котором принимать запросы разве не в конфиге?
Aleksey
Aleksey
И ты перед каждым запросом коннект типа поднимаешь?
Илья
мда, записывайтесь к Василию на курс вообщем
Aleksey
И больше не ешь эти грибы
Andrey
Интересный вопрос.
Если я в переменной храню указатель и в миллионе горутин его читаю, но только в одной пишу. При этом мне не важно прочитался старый указатель или новый. Состояние гонки может повредить указатель при одновременном чтении и записи и надо лочить?
Aleksey
go-database-sql.org вот это хорошо читать
Aleksey
Andrey
Stanislav
В гошечке одновременное чтение будет тебе триггерить варнинги про рейсы и у тебя твои миллион горутин повесят нахрен все)
Aleksey
Andrey
Короче, надо навернуть атомик, ок
Andrey
Пойду попробую вызвать панику при смене указателя
Aleksey
В вашем случае sync.RWMutex
Aleksey
Если большинство читает
Andrey
И то верно
Andrey
Но все же.
https://4gophers.ru/articles/konkurentnost-v-go-gonki/
Andrey
Вот в статье пример, где программа с состоянием гонки не вызывает панику
Andrey
(при этом, в моём вопросе не имеет значения корректность результата)
Andrey
Значит ли это, что можно не заморачиваться с синхронизацией?)
Maxim
Тогда пожалуйста
heavycharged
И ты перед каждым запросом коннект типа поднимаешь?
С чего это вдруг? Речь идет вот о чем:
1. Пришел запрос от клиента, берем наш *sql.DB
2. В это время наша горутина устанавливает коннект и в переменную database.DB пишет то, что вернул sql.Open.
Что это? Не гонка разве?
Aleksey
heavycharged
Какая разница что там внутри
Aleksey
Евгений
heavycharged
sql.Open() возвращает у тебя в DB, в этот момент ты берешь database.DB и обращаешься к нему.
heavycharged
объясните ему кто-то
heavycharged
когда коннект установился, понятно что внутри concurrent safe