MySQL Abfragen einfach asynchron im Hintergrund

Hier könnt ihr anderen Leuten helfen, indem ihr Anleitungen oder praktische Codesegmente zur Verfügung stellt.

Re: MySQL Abfragen einfach asynchron im Hintergrund

Beitragvon DerFreys » So 14. Jun 2015, 11:18

Habe nun schon ewig lang rumprobiert allerdings bekomme ich immer den selben Fehler:
Code:
Code: Alles auswählen
  1. getMySql().query("SELECT rang FROM clients WHERE uuid='" + "b00ef5a4-1b46-4018-bedd-c8a782d43990" + "'", new Consumer<ResultSet>() {
  2.          @Override
  3.          public void accept(ResultSet t) {
  4.             t.toString();
  5.             int test = 0;
  6.             try {
  7.                test = t.getInt("rang");
  8.             } catch (SQLException e) {
  9.                e.printStackTrace();
  10.             }
  11.             System.out.println(test);
  12.          }
  13.       });

Fehler:
Code: Alles auswählen
  1. [12:13:25] [pool-22-thread-2/WARN]: java.sql.SQLException: Before start of result set
  2. [12:13:25] [pool-22-thread-2/WARN]:    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
  3. [12:13:25] [pool-22-thread-2/WARN]:    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
  4. [12:13:25] [pool-22-thread-2/WARN]:    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982)
  5. [12:13:25] [pool-22-thread-2/WARN]:    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927)
  6. [12:13:25] [pool-22-thread-2/WARN]:    at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:841)
  7. [12:13:25] [pool-22-thread-2/WARN]:    at com.mysql.jdbc.ResultSetImpl.getInt(ResultSetImpl.java:2672)
  8. [12:13:25] [pool-22-thread-2/WARN]:    at com.mysql.jdbc.ResultSetImpl.getInt(ResultSetImpl.java:2813)
  9. [12:13:25] [pool-22-thread-2/WARN]:    at de.rodiplayz.craftbattleapi.CraftBattleAPI$1.accept(CraftBattleAPI.java:62)
  10. [12:13:25] [Server thread/INFO]: Server permissions file permissions.yml is empty, ignoring it
  11. [12:13:25] [pool-22-thread-2/WARN]:    at de.rodiplayz.craftbattleapi.CraftBattleAPI$1.accept(CraftBattleAPI.java:1)
  12. [12:13:25] [pool-22-thread-2/WARN]:    at de.rodiplayz.craftbattleapi.system.AsyncMySQL.lambda$3(AsyncMySQL.java:39)
  13. [12:13:25] [pool-22-thread-2/WARN]:    at de.rodiplayz.craftbattleapi.system.AsyncMySQL$$Lambda$37/157679332.run(Unknown Source)
  14. [12:13:25] [pool-22-thread-2/WARN]:    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
  15. [12:13:25] [pool-22-thread-2/WARN]:    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
  16. [12:13:25] [pool-22-thread-2/WARN]:    at java.lang.Thread.run(Thread.java:745)
Benutzeravatar
DerFreys
 
Beiträge: 26
Registriert: Sa 28. Feb 2015, 00:28

Re: MySQL Abfragen einfach asynchron im Hintergrund

Beitragvon Summerfeeling » So 14. Jun 2015, 11:31

GTRobin hat geschrieben:Habe nun schon ewig lang rumprobiert allerdings bekomme ich immer den selben Fehler:
Code:
Code: Alles auswählen
  1. getMySql().query("SELECT rang FROM clients WHERE uuid='" + "b00ef5a4-1b46-4018-bedd-c8a782d43990" + "'", new Consumer<ResultSet>() {
  2.          @Override
  3.          public void accept(ResultSet t) {
  4.             t.toString();
  5.             int test = 0;
  6.             try {
  7.                test = t.getInt("rang");
  8.             } catch (SQLException e) {
  9.                e.printStackTrace();
  10.             }
  11.             System.out.println(test);
  12.          }
  13.       });

Fehler:
Code: Alles auswählen
  1. [12:13:25] [pool-22-thread-2/WARN]: java.sql.SQLException: Before start of result set
  2. [12:13:25] [pool-22-thread-2/WARN]:    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
  3. [12:13:25] [pool-22-thread-2/WARN]:    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
  4. [12:13:25] [pool-22-thread-2/WARN]:    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982)
  5. [12:13:25] [pool-22-thread-2/WARN]:    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927)
  6. [12:13:25] [pool-22-thread-2/WARN]:    at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:841)
  7. [12:13:25] [pool-22-thread-2/WARN]:    at com.mysql.jdbc.ResultSetImpl.getInt(ResultSetImpl.java:2672)
  8. [12:13:25] [pool-22-thread-2/WARN]:    at com.mysql.jdbc.ResultSetImpl.getInt(ResultSetImpl.java:2813)
  9. [12:13:25] [pool-22-thread-2/WARN]:    at de.rodiplayz.craftbattleapi.CraftBattleAPI$1.accept(CraftBattleAPI.java:62)
  10. [12:13:25] [Server thread/INFO]: Server permissions file permissions.yml is empty, ignoring it
  11. [12:13:25] [pool-22-thread-2/WARN]:    at de.rodiplayz.craftbattleapi.CraftBattleAPI$1.accept(CraftBattleAPI.java:1)
  12. [12:13:25] [pool-22-thread-2/WARN]:    at de.rodiplayz.craftbattleapi.system.AsyncMySQL.lambda$3(AsyncMySQL.java:39)
  13. [12:13:25] [pool-22-thread-2/WARN]:    at de.rodiplayz.craftbattleapi.system.AsyncMySQL$$Lambda$37/157679332.run(Unknown Source)
  14. [12:13:25] [pool-22-thread-2/WARN]:    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
  15. [12:13:25] [pool-22-thread-2/WARN]:    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
  16. [12:13:25] [pool-22-thread-2/WARN]:    at java.lang.Thread.run(Thread.java:745)

Google würde dir direkt die Antwort liefern. Du bist in deinem ResultSet in noch keinem Eintrag. Du musst erst über rs.next() den 1. Eintrag auswählen.
Grüße
Summerfeeling | Timo
Benutzeravatar
Summerfeeling
 
Beiträge: 1300
Registriert: Sa 15. Jun 2013, 18:43
Wohnort: Viersen

Re: MySQL Abfragen einfach asynchron im Hintergrund

Beitragvon DerFreys » So 14. Jun 2015, 11:32

Hab ich danach auch gemerkt :D Dachte es lag an dem Consumer ;) Danke
Benutzeravatar
DerFreys
 
Beiträge: 26
Registriert: Sa 28. Feb 2015, 00:28

Re: MySQL Abfragen einfach asynchron im Hintergrund

Beitragvon Twister_21 » Fr 17. Jul 2015, 23:50

Hallo,
ich wollte mich zu Asynchrone MySQL noch mal informieren. Diese Klasse funktioniert ja gut, aber z.B für ein BanSystem braucht man jede Menge Consumer im Consumer. Das wird unübersichtlich. Im Dev-Tek-Forum habe ich auch mal gefragt und Jasmin hat mir gesagt, dass es besser ist, synchrone Methoden zu haben und die in einem asynchronen Thread auszuführen: https://dev-tek.de/index.php/Thread/651 ... 4#post7034

Was haltet ihr davon und wie macht ihr es?
Mit freundlichen Grüßen
Twister21
Benutzeravatar
Twister_21
 
Beiträge: 652
Registriert: Mi 11. Jun 2014, 05:51
Wohnort: Deutschland

Re: MySQL Abfragen einfach asynchron im Hintergrund

Beitragvon Jofkos » Sa 18. Jul 2015, 10:03

Es macht keinen Sinn, dass du, wenn du schon in einem anderen Thread bist, trotzdem nochmal irgendwas asynchron startest.
Ich habe diese Klasse für mich selbst schon vor eine Weile nochmal umstrukturiert, so, dass jede Methode synchron und asynchron ausführbar ist.
Jofkos

...........

..Bild
Benutzeravatar
Jofkos
 
Beiträge: 1537
Registriert: So 16. Jun 2013, 22:45

Re: MySQL Abfragen einfach asynchron im Hintergrund

Beitragvon IcySkill » Mo 2. Nov 2015, 19:40

Ich versuche im Moment etwas aus meine MySQL DB auszulesen mit diesem Code:

Code: Alles auswählen
  1. public String getData(UUID uuid) {
  2.         plugin.sqlAsync.query("SELECT data FROM system WHERE uuid = " + uuid.toString(), (ResultSet rs) -> {
  3.             try {
  4.                 rs.toString();
  5.                 rs.next();
  6.                 String data = rs.getString("data");
  7.                 //return data;
  8.             } catch (SQLException ex) {
  9.             }
  10.         });
  11.         return null;
  12.     }


Ich kann aber in eine Lambda-Expression kein return Statement einbauen. Wie muss ich das dann machen bzw. geht das überhaupt async?

Vielen Dank im Voraus!
Mit freundlichen Grüßen

- IcySkill
Benutzeravatar
IcySkill
 
Beiträge: 153
Registriert: Do 12. Feb 2015, 15:23
Wohnort: Baden-Württemberg

Re: MySQL Abfragen einfach asynchron im Hintergrund

Beitragvon Jofkos » Mo 2. Nov 2015, 23:16

Der Code innerhalb der Lambda Expression wird erst dann, wenn die Methode schon "lange" "durch" ist, ausgeführt. (Dann, wenn der MySQL Server geantwortet hat)
Das ist genau der Sinn des Consumers und der Grund warum man an solchen Stellen kein Return Statement verwendet bzw. verwenden kann.
Jofkos

...........

..Bild
Benutzeravatar
Jofkos
 
Beiträge: 1537
Registriert: So 16. Jun 2013, 22:45

Re: MySQL Abfragen einfach asynchron im Hintergrund

Beitragvon IcySkill » Di 3. Nov 2015, 01:28

Danke für deine Antwort. habe das mittlerweile auch gemerkt :D

Dazu habe ich aber ein andere Problem / Probleme mit der async-MySQL Klasse. Ich versuche den Spieler beim Joinen in die DB einzutragen mit folgendem Code:

Code: Alles auswählen
  1. public boolean exists(UUID uuid) {
  2.         try {
  3.             PreparedStatement statement = plugin.sqlAsync.prepare("SELECT name FROM " + plugin.tableName + " WHERE uuid = " + uuid.toString());
  4.             ResultSet rs = statement.executeQuery();
  5.             return rs.next();
  6.         } catch(Exception ex) {
  7.             MessageManager.getInstance().sendConsole(MessageType.BAD, new String[] { "DATABASE - ERROR while exists(UUID uuid)" });
  8.             ex.printStackTrace();
  9.         }
  10.         return false;
  11.     }
  12.    
  13.     public void create(UUID uuid, String name, String rank, int coins, int dopeys, int exp, long last) {
  14.         try {
  15.             plugin.sqlAsync.getMySQL().queryUpdate("INSERT INTO " + plugin.tableName + "(uuid, name, rank, coins, dopeys, exp, x, y, z, yaw, pitch, last) VALUES "
  16.                     + "(" + uuid.toString() + "," + name + "," + rank + "," + coins + "," + dopeys + "," + exp + "," + last + ")");
  17.             MessageManager.getInstance().sendConsole(MessageType.INFO, new String[] { "DATABASE - Data created!" });
  18.         } catch(Exception ex) {
  19.             MessageManager.getInstance().sendConsole(MessageType.BAD, new String[] { "DATABASE - ERROR can't create Data" });
  20.             ex.printStackTrace();
  21.         }
  22.     }


Jedoch wirft mir das folgende Fehler:

Code: Alles auswählen
  1. [01:12:38 INFO]: || system || DATABASE - ERROR while exists(UUID uuid)
  2. [01:12:38 WARN]: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Illegal double '66e7376' value found during parsing
  3. [01:12:38 WARN]:        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3591)
  4. [01:12:38 WARN]:        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3525)
  5. [01:12:38 WARN]:        at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1986)
  6. [01:12:38 WARN]:        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2140)
  7. [01:12:38 WARN]:        at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2626)
  8. [01:12:38 WARN]:        at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2111)
  9. [01:12:38 WARN]:        at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2273)
  10. [01:12:38 WARN]:        at de.IcySkill.System.Manager.DatabaseManager.exists(DatabaseManager.java:52)
  11. [01:12:38 WARN]:        at de.IcySkill.System.Manager.DatabaseManager.join(DatabaseManager.java:34)
  12. [01:12:38 WARN]:        at de.IcySkill.System.Listener.PlayersListener.onPlayerJoin(PlayersListener.java:33)
  13. [01:12:38 WARN]:        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  14. [01:12:38 WARN]:        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
  15. [01:12:38 WARN]:        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
  16. [01:12:38 WARN]:        at java.lang.reflect.Method.invoke(Unknown Source)
  17. [01:12:38 WARN]:        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:306)
  18. [01:12:38 WARN]:        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62)
  19. [01:12:38 WARN]:        at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:502)
  20. [01:12:38 WARN]:        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:487)
  21. [01:12:38 WARN]:        at net.minecraft.server.v1_8_R3.PlayerList.onPlayerJoin(PlayerList.java:296)
  22. [01:12:38 WARN]:        at net.minecraft.server.v1_8_R3.PlayerList.a(PlayerList.java:156)
  23. [01:12:38 WARN]:        at net.minecraft.server.v1_8_R3.LoginListener.b(LoginListener.java:144)
  24. [01:12:38 WARN]:        at net.minecraft.server.v1_8_R3.LoginListener.c(LoginListener.java:54)
  25. [01:12:38 WARN]:        at net.minecraft.server.v1_8_R3.NetworkManager.a(NetworkManager.java:231)
  26. [01:12:38 WARN]:        at net.minecraft.server.v1_8_R3.ServerConnection.c(ServerConnection.java:148)
  27. [01:12:38 WARN]:        at net.minecraft.server.v1_8_R3.MinecraftServer.B(MinecraftServer.java:817)
  28. [01:12:38 WARN]:        at net.minecraft.server.v1_8_R3.DedicatedServer.B(DedicatedServer.java:367)
  29. [01:12:38 WARN]:        at net.minecraft.server.v1_8_R3.MinecraftServer.A(MinecraftServer.java:657)
  30. [01:12:38 WARN]:        at net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:560)
  31. [01:12:38 WARN]:        at java.lang.Thread.run(Unknown Source)
  32. [01:12:38 INFO]: || system || DATABASE - Data created!
  33. [01:12:38 INFO]: || system || DATABASE - ERROR while query(PreparedStatement statement)
  34. [01:12:38 WARN]: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Illegal double '66e7376' value found during parsing
  35. [01:12:38 WARN]:        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3591)
  36. [01:12:38 WARN]:        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3525)
  37. [01:12:38 WARN]:        at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1986)
  38. [01:12:38 WARN]:        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2140)
  39. [01:12:38 WARN]:        at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2626)
  40. [01:12:38 WARN]:        at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2111)
  41. [01:12:38 WARN]:        at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2273)
  42. [01:12:38 WARN]:        at de.IcySkill.System.MySQL.MySQL.query(MySQL.java:79)
  43. [01:12:38 WARN]:        at de.IcySkill.System.MySQL.MySQL.query(MySQL.java:68)
  44. [01:12:38 WARN]:        at de.IcySkill.System.Manager.DatabaseManager.getInt(DatabaseManager.java:101)
  45. [01:12:38 WARN]:        at de.IcySkill.System.Listener.PlayersListener.onPlayerJoin(PlayersListener.java:35)
  46. [01:12:38 WARN]:        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  47. [01:12:38 WARN]:        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
  48. [01:12:38 WARN]:        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
  49. [01:12:38 WARN]:        at java.lang.reflect.Method.invoke(Unknown Source)
  50. [01:12:38 WARN]:        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:306)
  51. [01:12:38 WARN]:        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62)
  52. [01:12:38 WARN]:        at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:502)
  53. [01:12:38 WARN]:        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:487)
  54. [01:12:38 WARN]:        at net.minecraft.server.v1_8_R3.PlayerList.onPlayerJoin(PlayerList.java:296)
  55. [01:12:38 WARN]:        at net.minecraft.server.v1_8_R3.PlayerList.a(PlayerList.java:156)
  56. [01:12:38 WARN]:        at net.minecraft.server.v1_8_R3.LoginListener.b(LoginListener.java:144)
  57. [01:12:38 WARN]:        at net.minecraft.server.v1_8_R3.LoginListener.c(LoginListener.java:54)
  58. [01:12:38 WARN]:        at net.minecraft.server.v1_8_R3.NetworkManager.a(NetworkManager.java:231)
  59. [01:12:38 WARN]:        at net.minecraft.server.v1_8_R3.ServerConnection.c(ServerConnection.java:148)
  60. [01:12:38 WARN]:        at net.minecraft.server.v1_8_R3.MinecraftServer.B(MinecraftServer.java:817)
  61. [01:12:38 WARN]:        at net.minecraft.server.v1_8_R3.DedicatedServer.B(DedicatedServer.java:367)
  62. [01:12:38 WARN]:        at net.minecraft.server.v1_8_R3.MinecraftServer.A(MinecraftServer.java:657)
  63. [01:12:38 WARN]:        at net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:560)
  64. [01:12:38 WARN]:        at java.lang.Thread.run(Unknown Source)


Kann es sein, das ich mache Methoden davon nicht async ausführen kann? (Ich weiß das man nicht alles async ausführen kann).

Vielen Dank im Voraus!
Mit freundlichen Grüßen

- IcySkill
Benutzeravatar
IcySkill
 
Beiträge: 153
Registriert: Do 12. Feb 2015, 15:23
Wohnort: Baden-Württemberg

Re: MySQL Abfragen einfach asynchron im Hintergrund

Beitragvon PostCrafter » Di 3. Nov 2015, 11:47

Sieht für mich eher so aus als würdest du versuchen falsche Daten einzufügen, in diesem Fall liegt es vermutlich daran, dass deine UUID nicht in Anführungszeichen steht.

Bei deinem Insert-Statement fügst du zudem auch x, y, z, yaw und pitch nicht hinzu.
TeamSpeak-Server zur freien Nutzung: postcrafter.de
Benutzeravatar
PostCrafter
Administrator
 
Beiträge: 1443
Registriert: Do 6. Jun 2013, 19:16
Wohnort: Ebersberg

Re: MySQL Abfragen einfach asynchron im Hintergrund

Beitragvon IcySkill » Di 3. Nov 2015, 12:11

Danke! ... Mal wieder ein Leichtsinnsfehler ... -.- :D
Mit freundlichen Grüßen

- IcySkill
Benutzeravatar
IcySkill
 
Beiträge: 153
Registriert: Do 12. Feb 2015, 15:23
Wohnort: Baden-Württemberg

VorherigeNächste

Zurück zu Anleitungen

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste