Pomoc w asynchronicznym zapytaniu MySQL [1.15.2 Paper]

Pytania i problemy
mysql, java, bukkit
jbrudek
jbrudek

Witajcie, potrzebuje pomocy w asynchronicznym zapytaniu MySQL, aktualnie korzystam z zapytań w głównym wątku co nie jest zbyt dobrym rozwiązaniem, gdyż wątek czeka na odpowiedź przez co jest wielki STOP(lag) na serwerze. Oto mój aktualny kod i metoda w którym dostaje odpowiedź:

Klasa BAN

public class Ban extends Command implements TextBase, Core
{
public Ban()
{
    super("ban");
    setUsage(USAGE + "/ban  ");
    setPermissionMessage(PERM_MODERATOR);
}

@Override
public boolean execute(CommandSender sender, String s, String[] args)
{
    if(sender instanceof Player)
    {
        Player p = (Player) sender;
        String GROUP = GettersMySQL.getPrzywilej(p);

        //dalszy kod nie ważny

        return false;
     }
}

Metoda GettersMySQL.getPrzywilej()

public static String getPrzywilej(final Player p)
{
    String bankrupt = null;
    try
    {
        //GET PLAYERS TABLE = String GET_PLAYERS_TABLE = "SELECT * FROM `GRACZE` WHERE NICK = '{NICK}';";
        ResultSet result = statement.executeQuery(GET_PLAYERS_TABLE.replace("{NICK}", p.getName()));
        if(result.next())
        {
            bankrupt = result.getString("PRZYWILEJ");
        }
    }
    catch (SQLException e)
    {
        Bukkit.getLogger().log(Level.SEVERE, "[MySQL] Nie udało się pobrać przywileju (MySQL#getPrzywilej)");
        e.printStackTrace();
    }
    return bankrupt;
}

Linki do kodów: Klasa Ban Metoda GettersMySQL.getPrzywilej

Nie bardzo mam pomysł jak zdobyć rangę gracza przy zapytaniu asynchronicznym, pomóżcie mi! 😦

jbrudek
jbrudek

Ło dziękuje ale ja potrafię wyciągnąć dane korzystając z async query, chodzi o to że nie wiem jak je zapisać do zmiennej

pomóż no ktoś 😃

Nieznajomy11
Nieznajomy11 Moderator forum.lvlup.pro

Wystarczy użyć schedulera (pamiętając, że potem operacje po pobraniu danych należy wykonać w runTaskSynchronously - szczególnie modyfikacje terenu / operacje na entity):

this.getServer().getScheduler().runTaskAsynchronously(this, () -> {
  // kod w watku schedulera
});

Przykład dla klasy głównej wtyczki, w przypadku użycia w innej klasie trzeba przekazać instancje tej klasy zamiast this.

jbrudek
jbrudek

Dzięki akurat ten problem rozwiązałem wczoraj i zapomniałem napisać :slight_smile:

Dziękuje ci za pomoc w tamtym problemie, teraz wręcz spamię zapytaniami i 0 błędu.

system
system

Ten temat został automatycznie zamknięty 32 dni po ostatnim wpisie. Tworzenie nowych odpowiedzi nie jest już możliwe.