Leider stehen ich und die Datenbankverarbeitung auf Kriegsfuß ich weiß nicht warum aber meine query funktionieren meist nicht beim ersten versuch villeicht fehlt einfach die Erfahrung. Ich möchte für meine Projekt etwas in eine Datenbank schreiben die Datenbank liegt auf meinem Webspace den ich bei qLoc beziehe. Ich möchte gerne nur 1000 Rows pro Column haben sprich wird der Eintrag 1001 eingetragen soll Rows 1 gelöscht werden mein SQL query an sich funktioniert bereits:
Ich hab das über phpMyAdmin getestet da geht das Einwand frei, da ich ein ziemlich fauler Mensch bin habe ich mir eine eigene API gepastelt welche mir über Java verschiedene SQL Aktionen ausführt die API greift auf die HikariCP zu und das async so sieht mein Java Code aus:
Nun erhalte ich folgende Exception in der Console
Mir ist das nun schon öfters aufgefallen das SQL querys die anscheinend funktionieren sollten über Java anscheinend nicht funktionieren hab ich 2 Vermutungen entweder die mySQL Schnittstelle zu externen Diensten ist veraltet oder ich bin doof ! Meine API funktioniert sobalt ich nur den INSERT ausführe !
Code:
INSERT INTO `GRASS_BLOCK`(purchasePrice,retailPrice,amount) VALUES (300,500,600);
SELECT @lastid := max(id) from `GRASS_BLOCK`;
DELETE from `GRASS_BLOCK` WHERE id < (@lastid - 1000)
Ich hab das über phpMyAdmin getestet da geht das Einwand frei, da ich ein ziemlich fauler Mensch bin habe ich mir eine eigene API gepastelt welche mir über Java verschiedene SQL Aktionen ausführt die API greift auf die HikariCP zu und das async so sieht mein Java Code aus:
Java:
public void marktAction(){
if(task == null) {
task = Bukkit.getScheduler().runTaskLaterAsynchronously(DiceItemMarkt.getInstance(), () ->{
save();
String query = "INSERT INTO `GRASS_BLOCK`(purchasePrice,retailPrice,amount) VALUES (300,500,600);" +
"SELECT @lastid := max(id) from `GRASS_BLOCK`; " +
"DELETE from `GRASS_BLOCK` WHERE id < (@lastid - 1000)";
DiceServerAPI.getInstance().getDatabaseAPI().getServerWebsite().callbackUpdate(query, new CallbackStatement<Statement, SQLException>() {
@Override
public void onResult(Statement statment, SQLException arg1) {
if(arg1 != null) {
arg1.printStackTrace();
}else {
}
}
});
},20*5);
setAction(SQLAction.UPDATE);
}
caclulateNewPrice(getAmount());
DiceItemMarkt.getInstance().updateAllGui();
}
Nun erhalte ich folgende Exception in der Console
Code:
29.08 17:13:42 [Server] WARN com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'SELECT @lastid := max(id) from `GRASS_BLOCK`; DELETE from `GRASS_BLOCK` WHERE id' at line 1
29.08 17:13:42 [Server] WARN at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
29.08 17:13:42 [Server] WARN at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
29.08 17:13:42 [Server] WARN at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
29.08 17:13:42 [Server] WARN at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
29.08 17:13:42 [Server] WARN at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
29.08 17:13:42 [Server] WARN at com.mysql.jdbc.Util.getInstance(Util.java:408)
29.08 17:13:42 [Server] WARN at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:944)
29.08 17:13:42 [Server] WARN at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3976)
29.08 17:13:42 [Server] WARN at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3912)
29.08 17:13:42 [Server] WARN at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2530)
29.08 17:13:42 [Server] WARN at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2683)
29.08 17:13:42 [Server] WARN at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2482)
29.08 17:13:42 [Server] WARN at com.mysql.jdbc.StatementImpl.executeUpdateInternal(StatementImpl.java:1552)
29.08 17:13:42 [Server] WARN at com.mysql.jdbc.StatementImpl.executeLargeUpdate(StatementImpl.java:2607)
29.08 17:13:42 [Server] WARN at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1480)
29.08 17:13:42 [Server] WARN at com.zaxxer.hikari.pool.ProxyStatement.executeUpdate(ProxyStatement.java:120)
29.08 17:13:42 [Server] WARN at com.zaxxer.hikari.pool.HikariProxyStatement.executeUpdate(HikariProxyStatement.java)
29.08 17:13:42 [Server] WARN at de.Ste3et_C0st.Dicecraft.DatabaseAPI.DatabaseObj.lambda$callbackUpdate$0(DatabaseObj.java:50)
29.08 17:13:42 [Server] WARN at org.bukkit.craftbukkit.v1_13_R1.scheduler.CraftTask.run(CraftTask.java:76)
29.08 17:13:42 [Server] WARN at org.bukkit.craftbukkit.v1_13_R1.scheduler.CraftAsyncTask.run(CraftAsyncTask.java:52)
29.08 17:13:42 [Server] WARN at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
29.08 17:13:42 [Server] WARN at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
Mir ist das nun schon öfters aufgefallen das SQL querys die anscheinend funktionieren sollten über Java anscheinend nicht funktionieren hab ich 2 Vermutungen entweder die mySQL Schnittstelle zu externen Diensten ist veraltet oder ich bin doof ! Meine API funktioniert sobalt ich nur den INSERT ausführe !