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

  • Автор темы Автор темы 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.
 
Код хоть бы скинул. Впрочем, судя по прошлой теме, предположу, что ты выполняешь запросы к БД в основном потоке, чего делать не нужно.
 
Лучше покажи, что именно ты делаешь, и я попробую адаптировать.
Я точно не знаю из-за чего там ошибка, но вот, то что связанно с ней

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);
}

Вставил немного криво
 
или возможно просто потому-что mysql удалённый?
 
Я точно не знаю из-за чего там ошибка, но вот, то что связанно с ней

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);
}

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

По поводу самого кода - боюсь, это пока слишком сложно для тебя, но задумайся о кэшировании значений из БД при логине игрока. Элементарная реализация будет примерно такой
PHP:
private final Set<UUID> loggedIn;
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), который конкретно возвращает значение авторизации из БД.
или возможно просто потому-что mysql удалённый?
Независимо от этого, все операции I/O и запросы БД следует выполнять асинхронно, иначе они могут сильно затормозить основной поток.

Не хочу показаться слишком грубым, но по-моему, но в случае авторизации лучше не изобретать велосипед и воспользоваться готовыми вариантами. AuthMe до сих пор один из самых лучших плагинов для этого, да и писать аддоны для него весьма легко.
 
В следующий раз используй кнопки сверху - "Вставить..." > "Код", можно ещё выбрать PHP, ибо подсветка кода более-менее подходит

По поводу самого кода - боюсь, это пока слишком сложно для тебя, но задумайся о кэшировании значений из БД при логине игрока. Элементарная реализация будет примерно такой
PHP:
private final Set<UUID> loggedIn;
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 до сих пор один из самых лучших плагинов для этого, да и писать аддоны для него весьма легко.
хорошо, спасибо
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх