Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Помогите SQL & Bukkit ошибка при перезагрузке плагина

Метки:
Теги Теги
bukkit database java plugin sql

NyanGuyMF

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
_voidpointer
Пишу плагин с подключение к MySQL бд. Всё нормально, подключается, но при перезагрузке плагина /asw pmanager reload вылезает красивая ошибка:
PHP:
java.lang.VerifyError: Bad type on operand stack
Exception Details:
  Location:
    me/nyanguymf/jailplugin/managers/data/DatabaseManager.<init>()V @68: putfield
  Reason:
    Type 'me/nyanguymf/jailplugin/managers/data/MySQLCore' (current frame, stack[1]) is not assignable to 'me/nyanguymf/jailplugin/managers/data/Database'
  Current Frame:
    bci: @68
    flags: { }
    locals: { 'me/nyanguymf/jailplugin/managers/data/DatabaseManager', 'java/lang/String', 'java/lang/String', 'java/lang/String', integer, 'java/lang/String', 'java/lang/String' }
    stack: { 'me/nyanguymf/jailplugin/managers/data/DatabaseManager', 'me/nyanguymf/jailplugin/managers/data/MySQLCore' }
  Bytecode:
    0x0000000: 2ab7 000c 120e b800 104c 1216 b800 104d
    0x0000010: 1218 b800 104e 121a b800 1c36 0412 20b8
    0x0000020: 0010 3a05 1222 b800 103a 062b 1224 b600
    0x0000030: 2699 0019 2abb 002c 592c 2d15 0419 0519
    0x0000040: 06b7 002e b500 31a7 0037 bb00 3359 1235
    0x0000050: b700 372b b600 3a12 3eb6 003a b600 4012
    0x0000060: 44b8 0046 bb00 3359 124c b700 372b b600
    0x0000070: 3a12 3eb6 003a b600 4012 44b8 004e b1
  Stackmap Table:
    full_frame(@74,{Object[#1],Object[#39],Object[#39],Object[#39],Integer,Object[#39],Object[#39]},{})
    same_frame(@126)

    at me.nyanguymf.jailplugin.JailPlugin.onEnable(JailPlugin.java:40) ~[?:?]
    at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:264) ~[patched_1.12.2.jar:git-Paper-1587]
    at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:316) ~[patched_1.12.2.jar:git-Paper-1587]
    at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:405) ~[patched_1.12.2.jar:git-Paper-1587]
    at autosaveworld.features.pluginmanager.InternalUtils.loadPlugin(InternalUtils.java:104) ~[?:?]
    at autosaveworld.features.pluginmanager.PluginManager.reloadPlugin(PluginManager.java:253) ~[?:?]
    at autosaveworld.features.pluginmanager.PluginManager.handlePluginManagerCommand(PluginManager.java:66) ~[?:?]
    at autosaveworld.commands.subcommands.PluginManagerSubCommand.handle(PluginManagerSubCommand.java:36) ~[?:?]
    at autosaveworld.commands.NoTabCompleteCommandsHandler.onCommand(NoTabCompleteCommandsHandler.java:113) ~[?:?]
    at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44) ~[patched_1.12.2.jar:git-Paper-1587]
    at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:151) ~[patched_1.12.2.jar:git-Paper-1587]
    at org.bukkit.craftbukkit.v1_12_R1.CraftServer.dispatchCommand(CraftServer.java:685) ~[patched_1.12.2.jar:git-Paper-1587]
    at org.bukkit.craftbukkit.v1_12_R1.CraftServer.dispatchServerCommand(CraftServer.java:648) ~[patched_1.12.2.jar:git-Paper-1587]
    at net.minecraft.server.v1_12_R1.DedicatedServer.aP(DedicatedServer.java:463) ~[patched_1.12.2.jar:git-Paper-1587]
    at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:424) ~[patched_1.12.2.jar:git-Paper-1587]
    at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:774) ~[patched_1.12.2.jar:git-Paper-1587]
    at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:666) ~[patched_1.12.2.jar:git-Paper-1587]
    at java.lang.Thread.run(Thread.java:748) [?:1.8.0_191]
PHP:
/**
 * DatabaseManager.java 2018-12-31
 *
 * @author NyanGuyMF
 *
 * @version 1.0
 */
package me.nyanguymf.jailplugin.managers.data;

import java.sql.Connection;

import me.nyanguymf.jailplugin.JailPlugin;
import me.nyanguymf.jailplugin.managers.ConfigManager;

/**
 * Mediator pattern
 *
 * @author nyanguymf
 */
public class DatabaseManager implements IDatabase {
    private Database databaseCore;

    public DatabaseManager() {
        String  databaseDriver  = ConfigManager.getString("database.db-driver");
        String  host            = ConfigManager.getString("database.host");
        String  database        = ConfigManager.getString("database.database");
        int     port            = ConfigManager.getInt("database.port");
        String  user            = ConfigManager.getString("database.user");
        String  password        = ConfigManager.getString("database.password");

        if (databaseDriver.equalsIgnoreCase("mysql")) {
            databaseCore = new MySQLCore(host, database, port, user, password);
        } else { // TODO: add other SQL drivers
            // TODO: JailPlugin.log() && JailPlugin.debug()
            JailPlugin.log("Couldn't load " + databaseDriver + " database driver", "DatabaseManager");
            JailPlugin.debug("There is no " + databaseDriver + " database driver", "DatabaseManager");
        }
    }

    @Override
    public Connection getConnection() {
        return databaseCore.getConnection();
    }

    @Override
    public boolean isConnected() {
        return databaseCore.isConnected();
    }

    @Override
    public void close() {
        databaseCore.isConnected();
    }
}
PHP:
/**
 * MySQLCore.java 2018-12-31
 *
 * @author NyanGuyMF
 *
 * @version 1.0
 */
package me.nyanguymf.jailplugin.managers.data;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.SQLNonTransientConnectionException;

import me.nyanguymf.jailplugin.JailPlugin;

/**
 * @author nyanguymf
 *
 */
class MySQLCore extends Database {

    public MySQLCore(String host, String database, int port, String user, String password) {
        this.host       = host;
        this.database   = database;
        this.port       = port;
        this.user       = user;
        this.password   = password;

        try {
            connect();
        } catch (SQLNonTransientConnectionException ex) {
            JailPlugin.debug("You can use https://stackoverflow.com/questions/1673530/"
                            +"error-2003-hy000-cant-connect-to-mysql-server-on-127-0-0-1-111 to fix this", "Database");
            ex.printStackTrace();
        }
    }

    /**
     * Connect to database.
     */
    private void connect() throws SQLNonTransientConnectionException {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection(

                    "jdbc:mysql://" + host + ":" + port + "/" + database
                    + "?useUnicode=true&characterEncoding=utf-8&autoReconnect=true"
                    , user, password

                    );
        } catch (SQLException ex) {
            JailPlugin.debug("SQL Exception", "MySQLCore#connect()");
            ex.printStackTrace();
        } catch (ClassNotFoundException ex) {
            JailPlugin.debug("Class com.mysql.jdbc.Driver not found", "MySQLCore#connect()");
            ex.printStackTrace();
        }
    }

    @Override
    public Connection getConnection() {
        try {
            if (connection.isClosed() || connection == null)
                connect();

        } catch (SQLException ex) {
            JailPlugin.debug("SQL Exception", "MySQLCore#getConnection()");
            ex.printStackTrace();
        }

        return connection;
    }

    @Override
    public boolean isConnected() {
        return connection != null; // && connection.isClosed() ??
    }

    @Override
    public void close() {
        try {
            if (isConnected())
                connection.close();

        } catch (SQLException e) {
            JailPlugin.debug("SQL Exception", "MySQLCore#close()");
            e.printStackTrace();
        }
    }
}
Как это фиксить, чтобы можно было спокойно перезагружать плагин, а не сервер? :D
 
на странице плагина написано, что этим релоадом даже конфиги нельзя перегружать. а ты видимо новую джарку суешь, потому и ошибка. не уверен что это фиксится.
как альтернативу можешь попробовать hot swap
https://www.google.com/search?q=java+remote+debug+hot+swap
 
на странице плагина написано, что этим релоадом даже конфиги нельзя перегружать. а ты видимо новую джарку суешь, потому и ошибка. не уверен что это фиксится.
как альтернативу можешь попробовать hot swap
https://www.google.com/search?q=java+remote+debug+hot+swap
При перезагрузке плагинов без подключения к БД у меня всё нормально, а тут - ошибка :D
 
То же что и всегда, где-то остались используемые куски этого плагина. Либо поток где-то какой-то остался, либо забыл из сервера всё разрегать, либо есть другие зависимые плагины.
 
То же что и всегда, где-то остались используемые куски этого плагина. Либо поток где-то какой-то остался, либо забыл из сервера всё разрегать, либо есть другие зависимые плагины.
Нет ни плагинов, ни потоков. Не совсем понял, что означает "разрегать все сервера"? При выключении плагина выполняется метод, закрывающий соединение - DatabaseManager.close();

Как пофиксить-то? :D
 
"разрегать все сервера"
не разрегать все сервера, а разрегать всё из сервера. я плагины не пишу, но подозреваю что тут имеется ввиду вызов unregister если при загрузке ты делал register чего либо
 
не разрегать все сервера, а разрегать всё из сервера. я плагины не пишу, но подозреваю что тут имеется ввиду вызов unregister если при загрузке ты делал register чего либо
То есть возможный вариант решения - unregister(RegisteredListener listener) из HandlerList?
 

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

Назад
Верх