Pomoc w asynchronicznym zapytaniu MySQL [1.15.2 Paper]

jbrudek | 2021-02-17 10:25:29 UTC | #1

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 <nick> <powód>");
    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! :frowning:


logixdev | 2020-06-03 13:22:06 UTC | #2

https://www.spigotmc.org/wiki/connecting-to-databases-mysql/#asynchronous-database-interaction


jbrudek | 2020-06-03 13:45:59 UTC | #3

Ł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ś :smiley:


Nieznajomy11 | 2020-06-04 20:40:46 UTC | #5

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 | 2020-06-04 20:40:04 UTC | #6

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 | 2021-02-17 10:31:47 UTC | #7

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