1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Помогите База данных синхронизация

Тема в разделе "Разработка плагинов для новичков", создана пользователем Cristalix, 7 апр 2018.

  1. Автор темы
    Cristalix

    Cristalix Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Test
    У меня есть плагин который использует базу данных. Допустим игрок убил игрока мне нужно в таблице добавить к столбцу значение +1. И так же при вводе команды kills нужно выводить количиство его убийств. Столкнулся с такой проблемой что после ввода команды /kills сервер зависает на пару секунд. Я так понял это связано с тем что отправляется запрос в бд и ожидается ответ от нее. Тут мне рассказали что есть такая замечательная вещь как синхронизация. Это когда данные из бд и сервер автоматические синхронизируются. К сожалению я мало чего понял из этого решил обратиться сюда. Подскажите пожалуйста как можно синхронизировать сервер и базу данных? Что бы брались свежие результаты из базы данных.
     
  2. Loga

    Loga Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Heinz_H
    placeholderAPI? (твой сервер пишет кол-во килов даже без плагинов, этот плагин отображает кол-во убийств выгружая инфу с сервера)
    LeaderHeads? (пишет свою базу в MYSQL, лагов нет даже при онлайне 300+)

    зачем пихать на сервер парашные самописы если есть уже готовое
     
  3. hyndorik

    hyndorik Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    hyndo
    Ты бесполезен. Автор, юзай completablefuture
     
  4. maxim0098

    maxim0098 Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Nanit
    Как вариант, обмениваться данными с базой в отдельном потоке.
     
  5. hyndorik

    hyndorik Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    hyndo
    А я че выше написал?
     
  6. Автор темы
    Cristalix

    Cristalix Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Test
    Как часто?
     
  7. Cookie1337

    Cookie1337 Активный участник Пользователь

    Баллы:
    66
    Для начала создай отдельный поток, который будет выполнять твои запросы. То, есть создаешь потоко-безопасную очередь, и суешь туда запросы.(Запрос - объект, в котором строка queue - запрос, флаг rs - должна ли бд что то вернуть и Consumer<ResultSet> с названием callback, который ты должен выполнять, после получения результата) Далее тебе необходимо создать кеш(может подойти обычная хешмапа), и при заходе игрока, засовывать в очередь задачу на нахождения данных о игроке и записи в кеш. Потом, раз в 5 минут, тебе надо будет сделать сохранение данных всех игроков в кеше и потом удаления оффлайн игроков.(Для этого тебе надо будет делать один большой запрос, с данными всех пользователей).
    Автор, если что извини за непонятное объяснение:(
     
  8. maxim0098

    maxim0098 Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Nanit
    Думаю, при каждом запросе, т.е. вводе команды. Главное основной поток не забивать и сервер фризить не будет. А то, насколько быстро вернется результат уже от много зависит.
     
  9. hyndorik

    hyndorik Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    hyndo
    Ля такое нагородил ужз, притом что оно не будет нормально работать даже)) Обычная хеш мапа то для кеша не подойдет если она будет шарится между несколькими потоками. А на самом деле все делается намного проще с CompletableFuture. Тип того CompletableFuture.supplyAsync(() -> player.sendMessage(getInfoFromDb)). Желательно вторым аргументом указать свой тред пул, чтоб не забивать форк джойновский
     
  10. Cookie1337

    Cookie1337 Активный участник Пользователь

    Баллы:
    66
    При каждом выполнении команды отправлять запрос к БД... Ты же понимаешь что на большом сервере, она просто ляжет.
     
  11. hyndorik

    hyndorik Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    hyndo
    Кешировать значения кнч же запретили
     
  12. Cookie1337

    Cookie1337 Активный участник Пользователь

    Баллы:
    66
    прочти сообщения выше, где все это описано
     
    Последнее редактирование: 9 апр 2018
  13. hyndorik

    hyndorik Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    hyndo
    Ты какую-то хрень придумал с кол беками когда уже давно есть адекватные решения в виде ListenableFuture и CompletableFuture
     
  14. Cookie1337

    Cookie1337 Активный участник Пользователь

    Баллы:
    66
    Эта хрень называется программирование на callbackах. Используется не только в джаве
     
  15. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Если база правильно настроена и запросы идут в асинс, можно и без кеша. К примеру юзать oracle db, если нужна скорость.
     
    Последнее редактирование: 9 апр 2018
  16. hyndorik

    hyndorik Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    hyndo
    Ты походу вообще не вдупляешь о чем я... Может посмотришь реализацию CompletableFuture и listenable?
    В майне как всегда говно какое-то набирает популярность
     
  17. Cookie1337

    Cookie1337 Активный участник Пользователь

    Баллы:
    66
    CompetableFuture - самая обертка над потоками. ListenableFuture - ..что-то из спринга или гуавы. Ты думаешь слишком узко, если хочешь под каждый запрос пилить CombetableFuture
     
  18. hyndorik

    hyndorik Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    hyndo
    Чем тебе не нравится в каждом запросе возвращать CompletableFuture?
     
  19. Cookie1337

    Cookie1337 Активный участник Пользователь

    Баллы:
    66
    https://github.com/odnoklassniki/one-datasource
    Наверное, лучшая связка)
     
  20. Cookie1337

    Cookie1337 Активный участник Пользователь

    Баллы:
    66
    *под каждый тип запроса, CompetableFuture
    Нуу, к примеру утечки памяти, которые в лямбде сделать очень просто.
     

Поделиться этой страницей