Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

Помогите Java & SQLite

Тема в разделе "Разработка плагинов для новичков", создана пользователем Korvinius, 9 май 2016.

  1. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Просто есть ещё более медленные операции. * Кивает в сторону SQLite *
     
  2. Хостинг MineCraft
    <
  3. Автор темы
    Korvinius

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

    Баллы:
    88
    так ведь SQLite, это локальная БД, чисто теоретически, должна бы работать быстрее, или на практике нет?[DOUBLEPOST=1464034677,1464033880][/DOUBLEPOST]а, еще в дополнение, если у меня кое какие задачи выполняются по таймеру, ну то есть "шедулеры", они выполняются в каком потоке? (сори за нубские вопросы:oops:)
     
  4. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Это бд в файле, который нужно периодически сохранять/загружать. Некоторые драйверы из-за таймаута просто выгружают бд из памяти, из-за чего нужно бд снова прочитать и загрузить. Возможно, это неверное суждение, поскольку оно у меня работало более менее шустро (от 0 до 16 ms).
     
  5. Reality_SC

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

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Шедулер (Scheduler) — блок, выполняющий менеджмент задач (можно писать, например, тасков (Task)) для их выполнения по заданному расписанию.
    Все они (запускаемые через методы runTask*, schedule*Task и т.п.) планируются на определённые ближайшие серверные тики и, естественно, выполняются в основном потоке. В параллельном потоке будут запущены только те, которые ты стартанул через методы со словом Async*. Но это всё лишняя обёртка, поэтому для старта задачи в параллели достаточно сделать свою new Thread(...), а из неё планировать таски в основной цикл через runTask.
     
  6. Автор темы
    Korvinius

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

    Баллы:
    88
  7. hobabibs

    hobabibs Новичок Пользователь

    Баллы:
    16
    Имя в Minecraft:
    bhtyujnbfyu8
    Нужно держать соединение с SQLite открытым, как и с MySQL, тогда все операции осуществляются быстро.
     
  8. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Если на сервере 0 игроков в течение 12 часов, тоже оставлять открытой?
     
  9. Автор темы
    Korvinius

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

    Баллы:
    88
    хз правильно это или нет, сделал так, чтобы после запуска сервера, через "х" минут запускался второй поток,в котором бесконечный цыкл просыпается каждые 10 минут, обрабатывает имеющиеся данные и записывает их в БД, а так как есть 2 плановые перезагрузки сервера в 8.00 и 17.00, чтобы работа с базой не попала на время перезагрузки, сделал ее на 1 минуту раньше, то есть в 9, 19, 29, 39, 49, 59 минут каждого часа:
    Код:
        @Override
        public void onEnable() {
    
    
    
    
            BukkitScheduler scheduler = Bukkit.getServer().getScheduler();
            scheduler.scheduleSyncDelayedTask(this, new Runnable() {
                @Override
                public void run() {
                    new TimeLevelRun(Mystery.instance);
                    instance.getLogger().info("Обновление рангов запущено!");
                }
            }, getMinToHourNull()*1200);
        }
    
        public int getMinToHourNull() {
            int i = 0;
            Date d = new Date();
            SimpleDateFormat min = new SimpleDateFormat("mm");
            try {
                i = Integer.parseInt(min.format(d).toString());
            } catch (NumberFormatException e) { 
            }
    
            i = 60-(i+1);
            if (i>50)         return i-50;
            if (i<50 && i>40) return i-40;
            if (i<40 && i>30) return i-30;
            if (i<30 && i>20) return i-20;
            if (i<20 && i>10) return i-10;
            if (i<10 && i>5) return i-5;
            return i;
        }
    
    
    
    public class TimeLevelRun implements Runnable {
    
        private Mystery plugin;
        private Thread thread;
    
        public TimeLevelRun(Mystery plg) {
            this.plugin = plg;
            thread = new Thread(this, "Calculate time-level Players: ");
            thread.start();
        }
    
        @Override
        public void run() {
            LevelCalculate calc = new LevelCalculate();
           
            while(true) {
    
                calc.setTimesLevels(plugin);
                plugin.getLogger().info("Ранги обновлены!");
    
                try {
                    Thread.sleep(600000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
    
            }
        }
    }
     
  10. Reality_SC

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

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Это же просто файл, нет ничего плохого в том, что программа, работающая часами, держит файл, с которым она может обмениваться информацией, открытым.
    Можно ведь блокировать onDisable до тех пор, пока все данные не запишутся в БД. Даже если это параллельный поток, просто стоишь на ожидании его завершения и всё. Поэтому вся кухня с минутами костыль, имхо.

    Из альтернатив: пусть параллельный поток всегда пишет в БД, как только появляются новые данные. Тогда БД будет всегда почти сразу в актуальном состоянии. Сочетается с предыдущим абзацем.
     
  11. hobabibs

    hobabibs Новичок Пользователь

    Баллы:
    16
    Имя в Minecraft:
    bhtyujnbfyu8
    Разумеется. База локальная, как в случае с MySQL трафик не будет регулярно ходить туда-сюда, чтобы соединение не пало по таймауту.
    Держи всегда открытым, это нормально.
     
  12. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Возможно я имел в виду что используются ресурсы для этого, что немного фу. Хотя, я уже не помню, что хотел сказать этим :с
     
  13. hobabibs

    hobabibs Новичок Пользователь

    Баллы:
    16
    Имя в Minecraft:
    bhtyujnbfyu8
    21 век же, не надо быть мелочным. SQLite база данных - это не просто файл, это база данных. Там все продумано и все содержимое не хранится в памяти сервера.
     
  14. Автор темы
    Korvinius

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

    Баллы:
    88
    ну, изначально, я этот "костыль" лепил, для того, чтобы все нужные работы проводились по фиксированному времени, то есть не в 17.03 или 14.04, а 17.00, 14.00, 14.10 и т.д., чтобы знать точное время пересчета, но потом просто решил еще и отминусовать 1 минуту, дабы не пересекалось с рестартами...
     
  15. Reality_SC

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

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Ну, если работает и нет причин переписывать как-то лучше, конечно, ОКъ.
     
  16. Автор темы
    Korvinius

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

    Баллы:
    88
    я не говорю что нет причин делать лучше) просто объяснил зачем этот костыль делал, а для улучшения кода и причин искать не нужно...
     
  17. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Вай сколько костылей велосипедов. PreparedStatement не не слышали, от sql inj?[DOUBLEPOST=1464294714,1464294581][/DOUBLEPOST]Ты сломал мои глаза...

    1. i = 60-(i+1);
    2. if (i>50) return i-50;
    3. if (i<50 && i>40) return i-40;
    4. if (i<40 && i>30) return i-30;
    5. if (i<30 && i>20) return i-20;
    6. if (i<20 && i>10) return i-10;
    7. if (i<10 && i>5) return i-5;
    8. return i;
    9. К чему такая лесенка?
     
  18. Автор темы
    Korvinius

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

    Баллы:
    88
    хз, я же не профи, а любитель :) как сумел, так и придумал, есть вариант лучше? Я всегда благодарен за советы...
     
  19. CraftCoder

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

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    Насколько я знаю - это считается плохим тоном, поэтому закрываю соединение после каждой операции.
     
  20. Larin

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

    Баллы:
    103
    Создаём пул из 2-3 соединений и уже можно закрывать со спокойной душой, пул сам откроет соединение, если понадобится.
     
  21. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    На SQLite нет смысла закрывать, там же не общая база для овер900 плагинов и тп.
     

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