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

Помогите крашится сервер из-за ... mysql?

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

Статус темы:
Закрыта.
  1. Автор темы
    MixProYT

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

    Баллы:
    61
    Имя в Minecraft:
    MixProYT
    Не знаю, что случилось сейчас, но раньше такого не было

    [17:58:50 ERROR]: The server has stopped responding!
    [17:58:50 ERROR]: Please report this to http://www.spigotmc.org/
    [17:58:50 ERROR]: Be sure to include ALL relevant console errors and Minecraft crash reports
    [17:58:50 ERROR]: Spigot version: git-Spigot-79a30d7-unknown (MC: 1.12.2)
    [17:58:50 ERROR]: ------------------------------
    [17:58:50 ERROR]: Server thread dump (Look for plugins here before reporting to Spigot!):
    [17:58:50 ERROR]: ------------------------------
    [17:58:50 ERROR]: Current Thread: Server thread
    [17:58:50 ERROR]: PID: 17 | Suspended: false | Native: true | State: RUNNABLE
    [17:58:50 ERROR]: Stack:
    [17:58:50 ERROR]: java.net.DualStackPlainSocketImpl.connect0(Native Method)
    [17:58:50 ERROR]: java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
    [17:58:50 ERROR]: java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    [17:58:50 ERROR]: java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    [17:58:50 ERROR]: com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
    [17:58:50 ERROR]: com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:386)
    [17:58:50 ERROR]: com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:330)
    [17:58:50 ERROR]: java.sql.DriverManager.getConnection(DriverManager.java:664)
    [17:58:50 ERROR]: java.sql.DriverManager.getConnection(DriverManager.java:247)
    [17:58:50 ERROR]: friendcraft.auth.database.MYSQL.Connection(MYSQL.java:24)
    [17:58:50 ERROR]: friendcraft.auth.database.MYSQL.select(MYSQL.java:61)
    [17:58:50 ERROR]: friendcraft.auth.listeners.PlayerJoin.movestop(PlayerJoin.java:118)ссссссссссс
    [17:58:50 ERROR]: sun.reflect.GeneratedMethodAccessor2.invoke(Unknown Source)
    [17:58:50 ERROR]: sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    [17:58:50 ERROR]: java.lang.reflect.Method.invoke(Method.java:498)
    [17:58:50 ERROR]: org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:302)
    [17:58:50 ERROR]: org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62)
    [17:58:50 ERROR]: org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:500)
    [17:58:50 ERROR]: org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:485)
    [17:58:50 ERROR]: net.minecraft.server.v1_12_R1.PlayerConnection.a(PlayerConnection.java:658)
    [17:58:50 ERROR]: net.minecraft.server.v1_12_R1.PacketPlayInFlying.a(SourceFile:126)
    [17:58:50 ERROR]: net.minecraft.server.v1_12_R1.PacketPlayInFlying$PacketPlayInPositionLook.a(SourceFile:18)
    [17:58:50 ERROR]: net.minecraft.server.v1_12_R1.PlayerConnectionUtils$1.run(SourceFile:13)
    [17:58:50 ERROR]: java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    [17:58:50 ERROR]: java.util.concurrent.FutureTask.run(FutureTask.java:266)
    [17:58:50 ERROR]: net.minecraft.server.v1_12_R1.SystemUtils.a(SourceFile:46)
    [17:58:50 ERROR]: net.minecraft.server.v1_12_R1.MinecraftServer.D(MinecraftServer.java:748)
    [17:58:50 ERROR]: net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:406)
    [17:58:50 ERROR]: net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:679)
    [17:58:50 ERROR]: net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:577)
    [17:58:50 ERROR]: java.lang.Thread.run(Thread.java:748)
    [17:58:50 ERROR]: ------------------------------
    [17:58:50 ERROR]: Current Thread: Server Infinisleeper
    [17:58:50 ERROR]: PID: 18 | Suspended: false | Native: false | State: TIMED_WAITING
    [17:58:50 ERROR]: Stack:
    [17:58:50 ERROR]: java.lang.Thread.sleep(Native Method)
    [17:58:50 ERROR]: net.minecraft.server.v1_12_R1.DedicatedServer$1.run(DedicatedServer.java:60)
    [17:58:50 ERROR]: ------------------------------
    [17:58:50 ERROR]: Current Thread: NonBlockingInputStreamThread
    [17:58:50 ERROR]: PID: 15 | Suspended: false | Native: false | State: WAITING
    [17:58:50 ERROR]: Stack:
    [17:58:50 ERROR]: java.lang.Object.wait(Native Method)
    [17:58:50 ERROR]: org.bukkit.craftbukkit.libs.jline.internal.NonBlockingInputStream.run(NonBlockingInputStream.java:278)
    [17:58:50 ERROR]: java.lang.Thread.run(Thread.java:748)
    [17:58:50 ERROR]: ------------------------------
    [17:58:50 ERROR]: Current Thread: Snooper Timer
    [17:58:50 ERROR]: PID: 13 | Suspended: false | Native: false | State: TIMED_WAITING
    [17:58:50 ERROR]: Stack:
    [17:58:50 ERROR]: java.lang.Object.wait(Native Method)
    [17:58:50 ERROR]: java.util.TimerThread.mainLoop(Timer.java:552)
    [17:58:50 ERROR]: java.util.TimerThread.run(Timer.java:505)
    [17:58:50 ERROR]: ------------------------------
    [17:58:50 ERROR]: Current Thread: Attach Listener
    [17:58:50 ERROR]: PID: 5 | Suspended: false | Native: false | State: RUNNABLE
    [17:58:50 ERROR]: Stack:
    [17:58:50 ERROR]: ------------------------------
    [17:58:50 ERROR]: Current Thread: Signal Dispatcher
    [17:58:50 ERROR]: PID: 4 | Suspended: false | Native: false | State: RUNNABLE
    [17:58:50 ERROR]: Stack:
    [17:58:50 ERROR]: ------------------------------
    [17:58:50 ERROR]: Current Thread: Finalizer
    [17:58:50 ERROR]: PID: 3 | Suspended: false | Native: false | State: WAITING
    [17:58:50 ERROR]: Stack:
    [17:58:50 ERROR]: java.lang.Object.wait(Native Method)
    [17:58:50 ERROR]: java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:144)
    [17:58:50 ERROR]: java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:165)
    [17:58:50 ERROR]: java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:216)
    [17:58:50 ERROR]: ------------------------------
    [17:58:50 ERROR]: Current Thread: Reference Handler
    [17:58:50 ERROR]: PID: 2 | Suspended: false | Native: false | State: WAITING
    [17:58:50 ERROR]: Stack:
    [17:58:50 ERROR]: java.lang.Object.wait(Native Method)
    [17:58:50 ERROR]: java.lang.Object.wait(Object.java:502)
    [17:58:50 ERROR]: java.lang.ref.Reference.tryHandlePending(Reference.java:191)
    [17:58:50 ERROR]: java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)
    [17:58:50 ERROR]: ------------------------------
    [17:58:50 INFO]: Startup script './start.sh' does not exist! Stopping server.
     
  2. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Код хоть бы скинул. Впрочем, судя по прошлой теме, предположу, что ты выполняешь запросы к БД в основном потоке, чего делать не нужно.
     
  3. Автор темы
    MixProYT

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

    Баллы:
    61
    Имя в Minecraft:
    MixProYT
    а можно пример
     
  4. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Лучше покажи, что именно ты делаешь, и я попробую адаптировать.
     
  5. Автор темы
    MixProYT

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

    Баллы:
    61
    Имя в Minecraft:
    MixProYT
    Я точно не знаю из-за чего там ошибка, но вот, то что связанно с ней

    public void Connection() {
    String host = plugin.getConfig().getString("host");
    String port = plugin.getConfig().getString("port");
    String database = plugin.getConfig().getString("database");
    String login = plugin.getConfig().getString("login");
    String password = plugin.getConfig().getString("password");

    try {
    Class.forName("com.mysql.jdbc.Driver");
    this.conn = DriverManager.getConnection("jdbc:mysql://"+host+":"+port+"/"+database+"?autoReconnect=true&useSSL=false", login, password);
    } catch (SQLException | ClassNotFoundException) {
    throwables.printStackTrace();
    }

    }

    public ArrayList<String> select(String user) {
    try {
    Connection();
    PreparedStatement preparedStatement = conn.prepareStatement("SELECT * FROM `FCAuth` WHERE name = '"+user+"'");
    ResultSet e = preparedStatement.executeQuery();
    ArrayList<String> item = new ArrayList<String>();
    if (e.next()) {
    item.add(e.getString(2));
    item.add(e.getString(4));
    item.add(e.getString(3));
    item.add(e.getString(5));
    item.add(e.getString(6));
    item.add(e.getString(7));
    e.close();
    return item;
    }
    } catch (Exception e) {
    return null;
    }finally {
    try {
    if (conn != null) conn.close();
    } catch (SQLException e) {
    e.printStackTrace();
    }
    }
    return null;
    }

    @EventHandler
    public void movestop(PlayerMoveEvent e) {
    Player player = e.getPlayer();
    String name = player.getName();
    ArrayList<String> info;
    if (plugin.getConfig().getString("db").equals("mysql")) {
    MYSQL sql = new MYSQL(plugin);
    info = sql.select(name);
    } else {
    SQLite sql = new SQLite();
    info = sql.select(name);
    }

    boolean login;
    if(info == null) login = false; else login = Boolean.parseBoolean(info.get(1));
    e.setCancelled(!login);
    }

    Вставил немного криво
     
  6. Автор темы
    MixProYT

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

    Баллы:
    61
    Имя в Minecraft:
    MixProYT
    или возможно просто потому-что mysql удалённый?
     
  7. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    В следующий раз используй кнопки сверху - "Вставить..." > "Код", можно ещё выбрать PHP, ибо подсветка кода более-менее подходит

    По поводу самого кода - боюсь, это пока слишком сложно для тебя, но задумайся о кэшировании значений из БД при логине игрока. Элементарная реализация будет примерно такой
    PHP:
    private final Set<UUIDloggedIn;
    private final 
    Database database;
    private final 
    Plugin plugin;

    @
    EventHandler(priority EventPriority.LOWEST)
    public 
    void onLogin(PlayerLoginEvent event) {
        
    UUID id event.getPlayer().getUniqueId();
        if (!
    loggedIn.contains(id)) {
            
    BukkitScheduler scheduler Bukkit.getScheduler();
            
    scheduler.runTaskAsynchronously(plugin, () -> {
                if (
    database.isLoggedIn(id)) {
                    
    scheduler.runTask(plugin, () -> loggedIn.put(id));
                }
            });
        }
    }

    @
    EventHandler(priority EventPriority.LOWEST)
    public 
    void onMove(PlayerMoveEvent event) {
        if (!
    loggedIn.contains(event.getPlayer().getUniqueId())) {
            
    event.setCancelled(true);
        }
    }
    Сет loggedIn содержит в себе UUID залогиненых игроков. Когда игрок логинится - он должен быть добавлен в этот сет. Конечно, лучше ему и database быть в отдельным классе, каком-нибудь менеджере авторизаций, но так проще показать использование. Да и кэшировать следует и остальные данные - пароль из БД хотя бы, но для этого всего стоит создать отдельный класс, а-ля LoginProfile. Database - некий интерфейс с некоторыми нужными методами, включая Database#isLoggedIn(UUID), который конкретно возвращает значение авторизации из БД.
    Независимо от этого, все операции I/O и запросы БД следует выполнять асинхронно, иначе они могут сильно затормозить основной поток.

    Не хочу показаться слишком грубым, но по-моему, но в случае авторизации лучше не изобретать велосипед и воспользоваться готовыми вариантами. AuthMe до сих пор один из самых лучших плагинов для этого, да и писать аддоны для него весьма легко.
     
  8. Автор темы
    MixProYT

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

    Баллы:
    61
    Имя в Minecraft:
    MixProYT
    хорошо, спасибо
     
Статус темы:
Закрыта.

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