Здравствуйте, гость ( Вход | Регистрация )

> mysql
Famous
сообщение 20.5.2017, 1:07
Сообщение #1


******

Expert
Сообщений: 635
Регистрация: 12.4.2005
Группа: Пользователи
Наличность: 0
Пользователь №: 3.499



всем привет.

хочу поинтересоваться, как лучше обновлять записи в таблице?
то есть, делать это всегда когда игрок заходит или лучше раз в 24 часа ?
когда обновляешь запись в базе, нужно обязательно писать db.close или это не стоит?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
 
Ответить в эту темуОткрыть новую тему
Ответов
Reality Audit
сообщение 22.7.2017, 11:08
Сообщение #2


**

Neophyte
Сообщений: 12
Регистрация: 16.7.2017
Группа: Пользователи
Наличность: 0
Пользователь №: 18.540
Возраст: 30



От задачи зависит (IMG:style_emoticons/default/wacko.gif)

@Soteric у базы есть
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Aimed
сообщение 22.7.2017, 22:53
Сообщение #3


*********

Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012
Группа: Пользователи
Наличность: 6039
Пользователь №: 15.607



Цитата(Reality Audit @ 22.7.2017, 10:08) *

От задачи зависит (IMG:style_emoticons/default/wacko.gif)

@Soteric у базы есть


Гипотетическая задача была дана, - сделать топ500. Дальше можно самому додумать.

Цитата(Soteric @ 22.7.2017, 4:18) *

В сфере есть пул коннектов? Или на каждый запрос открывается/закрывается физически новое подключение?


Конечно нет.
Открываешь/закрываешь новое подключение к бд вручную, как и везде обычно.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Soteric
сообщение 23.7.2017, 1:26
Сообщение #4


********

Master
Сообщений: 1.377
Регистрация: 7.8.2006
Группа: Пользователи
Наличность: 507
Пользователь №: 7.166



Цитата(Aimed @ 22.7.2017, 22:53) *

Конечно нет.
Открываешь/закрываешь новое подключение к бд вручную, как и везде обычно.

Везде обычно коннект открывается один раз в начале работы с базой и потом переиспользуется.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Aimed
сообщение 23.7.2017, 3:32
Сообщение #5


*********

Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012
Группа: Пользователи
Наличность: 6039
Пользователь №: 15.607



Цитата(Soteric @ 23.7.2017, 0:26) *

Везде обычно коннект открывается один раз в начале работы с базой и потом переиспользуется.


При синхронной работе почти всегда открывается коннект и в try/catch блоке выполняется то что надо и коннект закрывается.

Если речь идет об асинхронной работе с бд, то в try/catch блоке идёт разгрузка очереди запросов для БД и тут уже по разному.
Если у тебя это в каком-нибудь мейн лупе происходит и почти в каждом цикле в очереди есть запросы, тогда обычно оставляют коннект открытым и закрывают при закрытии аппликации.

Если у тебя есть просто очередь для асинхронной работы с бд и иногда в цикле в очередь могут попасть запросы, то при разгрузке открывают и закрывают.
Мне ща лень рыться в исходниках сферы, но я более чем уверен что они для своих AQUERY/AEXECUTE тоже открывают и закрывают коннект.

Лучше лишний раз открыть и закрыть, нежели проворонить где-то этот момент и создать потенциальную утечку, которую решить может только перезагрузка БД.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Soteric
сообщение 23.7.2017, 13:54
Сообщение #6


********

Master
Сообщений: 1.377
Регистрация: 7.8.2006
Группа: Пользователи
Наличность: 507
Пользователь №: 7.166



Цитата(Aimed @ 23.7.2017, 3:32) *

При синхронной работе почти всегда открывается коннект и в try/catch блоке выполняется то что надо и коннект закрывается.

Если речь идет об асинхронной работе с бд, то в try/catch блоке идёт разгрузка очереди запросов для БД и тут уже по разному.
Если у тебя это в каком-нибудь мейн лупе происходит и почти в каждом цикле в очереди есть запросы, тогда обычно оставляют коннект открытым и закрывают при закрытии аппликации.

Если у тебя есть просто очередь для асинхронной работы с бд и иногда в цикле в очередь могут попасть запросы, то при разгрузке открывают и закрывают.
Мне ща лень рыться в исходниках сферы, но я более чем уверен что они для своих AQUERY/AEXECUTE тоже открывают и закрывают коннект.

Лучше лишний раз открыть и закрыть, нежели проворонить где-то этот момент и создать потенциальную утечку, которую решить может только перезагрузка БД.

(IMG:style_emoticons/default/blink.gif)

Даже двухнедельный junior разработчик понимает, что новый коннект это ненужные накладные расходы и старается их избежать.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Aimed
сообщение 24.7.2017, 0:02
Сообщение #7


*********

Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012
Группа: Пользователи
Наличность: 6039
Пользователь №: 15.607



Цитата(Soteric @ 23.7.2017, 12:54) *

(IMG:style_emoticons/default/blink.gif)

Даже двухнедельный junior разработчик понимает, что новый коннект это ненужные накладные расходы и старается их избежать.


Оно и видно что джуниор и статья 2010 года.
Во первых, на сегодняшний день апликации стараются делать мультипоточными и для работы с БД это делается как я описал выше - с очередями по producer/consumer принципу. Либо через всякие async/await/Task.
Потому что работа прозводится в отдельном потоке, те пару мс или даже секунд для создания соединения роли не играют, гораздо важнее что бы не было утечек.

(Внимание, потенциально опасная тема для холивара!)
Во вторых, singleton шаблон, это устаревший шаблон который как можно быстрее желательно забыть и не вспоминать. Для современных, мультипоточных апликаций желательно создавать новые обьекты и клонировать все это дело на крайний случай, что-бы не было веселых ситуаций с race conditions или всяких проблем от того что понавставлено 100500 локов и в коде все это выглядит как настоящий ад, а каждое изменения такого кода приводит к потецинальному дед локу.\

В третьих, обычно если со Сферы что-то загоняют в БД, этой БД желательно находится на той-же самой машине и создание соединения там будет длиться 0 времени. Ежели БД на другом сервере где-то в сети, лучше просто работать через AEXECUTE/AQUERY.

Цитата(Reality Audit @ 23.7.2017, 9:09) *

Предположим, делаем топ500 (пробежался по сайтам шардов, чтобы заценить что именно туда выносят)
Почти все нужная инфа есть на чаре в дефолтных полях (киллы/карма) или в тегах (опыт или лвл, например) или по соседству (на аккаунте).
Самый зверский способ - писать в базу каждый раз при изменении атрибута. Если онлайн небольшой, можно не запариваться и так и сделать. Если сервер упал или был откат - при старте можно перекалькулировать

Компромисс - писать в какое-то время всё целиком и привязать это, например, к сейву. Засейвились, открыли коннекцию к базе, пробежались по чарам/аккаунтам, скинули в базу, закрыли коннект.



Хм, да, забыл что может сервер упасть и случиться откат. Смешно вышло, потмоу что сам не так давно занимался системой сейвов для РанУО в реальном времени с сохранением изменений в базу на каждом тике в главном цикле ))

На самом деле это не зверский способ, примерно так на сегодняшний день сохраняют данные современные ММОРПГ.
Для УО, с её сейвами в файл с остановлением сервера правда лучше после сейва брать все это дело.
А потому что речь идёт о Сфере, в которой нет возможности писать мультипоточный код, лучше все-таки сделать отдельную программу и парсить файл с сейвами, что-бы не мешать Сфере работать и не удлиннять сейвы и не создавать лаги для игроков. Соберая данные для БД из всех плееров по какому-то таймеру раз в х времени может записать неактуальные данные в базу если сервер откатится, а так-же может создать лаги, потому что все это будет происходить в главном треде Сферы.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Сообщений в этой теме
Famous   mysql   20.5.2017, 1:07
Reality Audit   Смотря какие и сколько. Ты для статистики играющих...   16.7.2017, 15:07
Llirik   Смотря, что ты собираешься делать. Если TOP, то, е...   16.7.2017, 18:59
Famous   Смотря, что ты собираешься делать. Если TOP, то, ...   17.7.2017, 8:46
Aimed   Если Connect делаешь то и Close всегда после выпол...   17.7.2017, 11:38
Famous   при запуске db.connect и все, а потом уже команды ...   18.7.2017, 20:46
Aimed   при запуске db.connect и все, а потом уже команды...   19.7.2017, 11:56
Juzzver   Открыл коннект, поработал с базой, закрыл коннект...   19.7.2017, 11:04
Reality Audit   Смотря какой лимит пула конекций базы. Ребутить ба...   19.7.2017, 18:56
Famous   ну папример топ500 всегда открыт коннект и когда и...   20.7.2017, 10:26
Aimed   ну папример топ500 всегда открыт коннект и когда ...   20.7.2017, 15:53
Juzzver   Если ты не закрыл сессию с подключением, то она п...   20.7.2017, 15:56
Famous   Понял:) спасибо У меня в данном случае 5 таблиц и ...   20.7.2017, 17:53
Aimed   И что же ты понял если ты задал тот же самый вопро...   20.7.2017, 20:21
Famous   Например, при онлаин 50+ игрок зашел в игру (обнов...   20.7.2017, 21:00
Aimed   Например, при онлаин 50+ игрок зашел в игру (обно...   20.7.2017, 21:56
Famous   пасибо :)   20.7.2017, 22:57
Llirik   Приведите пример AQUERY/AEXECUTE!   20.7.2017, 23:12
Aimed   Приведите пример AQUERY/AEXECUTE! У тебя пр...   20.7.2017, 23:57
Reality Audit   Пиво @Juzzver`y Открытие коннекции, сбор атриб...   21.7.2017, 20:10
Aimed   Пиво @Juzzver`y Открытие коннекции, сбор атри...   22.7.2017, 5:38
Soteric   В сфере есть пул коннектов? Или на каждый запрос о...   22.7.2017, 5:18
Reality Audit   :blink: Даже двухнедельный junior разработчик п...   23.7.2017, 19:47
Reality Audit   Гипотетическая задача была дана, - сделать топ500...   23.7.2017, 10:09
Llirik   У меня коннект открывается всего лишь 1 раз при ст...   23.7.2017, 15:15
Aimed   У меня коннект открывается всего лишь 1 раз при с...   24.7.2017, 0:45
Juzzver   А если он по каким либо причинам закроется еще до...   23.7.2017, 19:32
Aimed   А если он по каким либо причинам закроется еще до...   24.7.2017, 0:58
Llirik   Каких нах утечек? Вы знаете, что надо создавать та...   24.7.2017, 20:46
Aimed   Каких нах утечек? Вы знаете, что надо создавать т...   25.7.2017, 5:01
Reality Audit   Каких нах утечек? Вы знаете, что надо создавать т...   25.7.2017, 18:37
Llirik   Вы каждый раз файл через [EOF] закрываете?   25.7.2017, 20:37
Reality Audit   Вы каждый раз файл через [EOF] закрываете? Дава...   27.7.2017, 17:56
Aimed   Давай сверим часы чувак, сейчас четверг гребанног...   27.7.2017, 19:05
Reality Audit   Не, это у него такая свойственная манера общения....   28.7.2017, 16:09


Ответить в эту темуОткрыть новую тему
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 19.7.2025, 17:00
Designed by Nickostyle