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.