heavycharged
пул коннектов я имею ввиду sql.DB, там же внутри есть уже пул
heavycharged
короче, где хранить *sql.DB
heavycharged
вот что я хотел узнать)
heavycharged
ну т.е., у меня есть хендлеры, и в них передавать *sql.DB? а чем плохо database.Get().Query() делать?
heavycharged
ну или database.Get() и погнал
Aleksey
пул коннектов я имею ввиду sql.DB, там же внутри есть уже пул
Есть, и установить ограничения сразу, чтобы базу на отторжение лишних не наталкивать
🎉
короче, где хранить *sql.DB
Вот образец, за код не пинать, первая прожка на го. https://github.com/MarlikAlmighty/examplefasthttp
Aleksey
Зачем Get? database.DB.Query()
heavycharged
Зачем Get? database.DB.Query()
ну а инициализацию как сделать? Допустим, база ещё не поднялась. но приложуха уже должна что-то отвечать
heavycharged
пока sql.Open() поинтер будет нил, и потом будет race condition
Aleksey
Есть init
heavycharged
init блочит же
🎉
Инит лучше не юзать.
Dmitry
init блочит же
где можно поподробней почитать?
Aleksey
Инит, да, плохо. Или заранее, прочитать конфиг, соединение с базой сделать
heavycharged
где можно поподробней почитать?
напиши в init time.Sleep(time.Second * 60)
🎉
Да вон же наверху ссылка, написано криво, но смысл там понятен, там всего два файла.
🎉
И пока прога не проинициализируется, нахрена ей отвечать что-то?
heavycharged
heavycharged
она должна отвечать ошибкой и не копить их, ну или копить пока не треснет
🎉
Нихрена не понял, у тебя нет соединения с базой, нет ничего, но уже есть коннекты?
heavycharged
ну да, люди долбят сайт
Aleksey
ну да, люди долбят сайт
Пока с базой не соединишься никуда всё-равно не поедешь
🎉
Смотря как сайт стартует, если без бэкенда стартует то хз, так-то пока бэкенд не готов нехер чото делать. Пусть бэкенд сначала стартует, генерит шаблон сайта, подрубается к БД, а потом и обрабатывать запросы можно.
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
И больше не ешь эти грибы
Andrey
Интересный вопрос. Если я в переменной храню указатель и в миллионе горутин его читаю, но только в одной пишу. При этом мне не важно прочитался старый указатель или новый. Состояние гонки может повредить указатель при одновременном чтении и записи и надо лочить?
Aleksey
go-database-sql.org вот это хорошо читать
Stanislav
go-database-sql.org вот это хорошо читать
Лучше вообще про рейсы почитать, наверно
Aleksey
Лучше вообще про рейсы почитать, наверно
Это я про предыдущую тему о базе
Stanislav
В гошечке одновременное чтение будет тебе триггерить варнинги про рейсы и у тебя твои миллион горутин повесят нахрен все)
Stanislav
Это я про предыдущую тему о базе
Прошу прощения, не там пальцем провел) это на сообщение выше писал
Andrey
Короче, надо навернуть атомик, ок
Andrey
Пойду попробую вызвать панику при смене указателя
Aleksey
В вашем случае sync.RWMutex
Aleksey
Если большинство читает
Andrey
И то верно
Stanislav
Пойду попробую вызвать панику при смене указателя
В любом случае хорошее правило - если читает/пишет больше одного, то мьютекс
Andrey
Но все же. https://4gophers.ru/articles/konkurentnost-v-go-gonki/
Andrey
Вот в статье пример, где программа с состоянием гонки не вызывает панику
Andrey
(при этом, в моём вопросе не имеет значения корректность результата)
Andrey
Значит ли это, что можно не заморачиваться с синхронизацией?)
Maxim
Значит ли это, что можно не заморачиваться с синхронизацией?)
Гонка не вызывает панику, она вызывает непредсказуемое поведение приложения, что намного хуже чем паника.
Andrey
Гонка не вызывает панику, она вызывает непредсказуемое поведение приложения, что намного хуже чем паника.
Я же говорю, что меня устраивает, что будет прочитан старый указатель. Это (для меня) предсказуемое поведение.
Maxim
Тогда пожалуйста
heavycharged
И ты перед каждым запросом коннект типа поднимаешь?
С чего это вдруг? Речь идет вот о чем: 1. Пришел запрос от клиента, берем наш *sql.DB 2. В это время наша горутина устанавливает коннект и в переменную database.DB пишет то, что вернул sql.Open. Что это? Не гонка разве?
Zver
Я же говорю, что меня устраивает, что будет прочитан старый указатель. Это (для меня) предсказуемое поведение.
Это пока устраивает. А потом не будет устраивать, но забудется и придется искать причину ошибки. Так что лучше сразу нормально сделать.
heavycharged
Какая разница что там внутри
Евгений
это был вам намёк, что делом надо заниматься, а не призрачный тест кавердж блюсти
возможно, но удобно видеть, когда вдруг какой-то тест случайно оторвал
Aleksey
Какая разница что там внутри
Ты ещё мутексы мутексами оборачивай
heavycharged
sql.Open() возвращает у тебя в DB, в этот момент ты берешь database.DB и обращаешься к нему.
heavycharged
объясните ему кто-то
heavycharged
когда коннект установился, понятно что внутри concurrent safe
Andrey
Это пока устраивает. А потом не будет устраивать, но забудется и придется искать причину ошибки. Так что лучше сразу нормально сделать.
=) это продуманное решение в пользу быстродействия. Задача была сэкономить такты на лочках при подмене одного кеша другим (кеш в сложной структуре с мапами, поэтому просто подменяем указатели). При этом какой кеш успел прочитать клиент - не принципиально, критична именно скорость ответа.