TheRedCraft Posted July 12, 2017 Share Posted July 12, 2017 Hallo ich habe ein Problem mit meiner sqlite datenbank [20:21:37 INFO]: Datenbank Fehler: [SQLITE_BUSY] The database file is locked (database is locked) [20:21:37 WARN]: java.lang.NullPointerException [20:21:37 WARN]: at de.n3yut9j.listener.Event_ServerPing.onserverping(Event_ServerPing.java:29) [20:21:37 WARN]: at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [20:21:37 WARN]: at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) [20:21:37 WARN]: at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [20:21:37 WARN]: at java.lang.reflect.Method.invoke(Method.java:498) [20:21:37 WARN]: at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:306) [20:21:37 WARN]: at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) [20:21:37 WARN]: at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:502) [20:21:37 WARN]: at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:487) [20:21:37 WARN]: at net.minecraft.server.v1_8_R3.PacketStatusListener.a(PacketStatusListener.java:101) [20:21:37 WARN]: at net.minecraft.server.v1_8_R3.PacketStatusInStart.a(SourceFile:23) [20:21:37 WARN]: at net.minecraft.server.v1_8_R3.PacketStatusInStart.a(SourceFile:8) [20:21:37 WARN]: at net.minecraft.server.v1_8_R3.NetworkManager.a(NetworkManager.java:124) [20:21:37 WARN]: at net.minecraft.server.v1_8_R3.NetworkManager.channelRead0(NetworkManager.java:325) [20:21:37 WARN]: at net.minecraft.server.v1_8_R3.NetworkManager.channelRead0(NetworkManager.java:1) [20:21:37 WARN]: at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105) [20:21:37 WARN]: at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:333) [20:21:37 WARN]: at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:319) [20:21:37 WARN]: at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:168) [20:21:37 WARN]: at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:333) [20:21:37 WARN]: at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:319) [20:21:37 WARN]: at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:163) [20:21:37 WARN]: at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:333) [20:21:37 WARN]: at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:319) [20:21:37 WARN]: at com.comphenix.protocol.injector.netty.ChannelInjector$4.channelRead(ChannelInjector.java:273) [20:21:37 WARN]: at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:333) [20:21:37 WARN]: at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:319) [20:21:37 WARN]: at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:163) [20:21:37 WARN]: at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:333) [20:21:37 WARN]: at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:319) [20:21:37 WARN]: at net.minecraft.server.v1_8_R3.LegacyPingHandler.channelRead(SourceFile:94) [20:21:37 WARN]: at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:333) [20:21:37 WARN]: at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:319) [20:21:37 WARN]: at io.netty.handler.timeout.ReadTimeoutHandler.channelRead(ReadTimeoutHandler.java:150) [20:21:37 WARN]: at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:333) [20:21:37 WARN]: at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:319) [20:21:37 WARN]: at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:787) [20:21:37 WARN]: at io.netty.channel.epoll.EpollSocketChannel$EpollSocketUnsafe.epollInReady(EpollSocketChannel.java:722) [20:21:37 WARN]: at io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:326) [20:21:37 WARN]: at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:264) [20:21:37 WARN]: at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:116) [20:21:37 WARN]: at java.lang.Thread.run(Thread.java:745) und ich weiß nicht woran es ligen könnte hier ist noch das server ping event package de.n3yut9j.listener; import java.sql.ResultSet; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.server.ServerListPingEvent; import de.n3yut9j.main.Main; public class Event_ServerPing implements Listener{ @SuppressWarnings("unused") private Main system; public Event_ServerPing(Main system) { this.system = system; } @EventHandler(priority = EventPriority.HIGH) public void onserverping(ServerListPingEvent e){ String player = "Spieler"; try { ResultSet rs = Main.db.query("SELECT name FROM users WHERE ip='"+e.getAddress().getHostAddress()+"';"); if(rs.next()) { player = rs.getString("name"); } }catch(Exception ex){ex.printStackTrace();} e.setMotd(ChatColor.translateAlternateColorCodes('&', Bukkit.getMotd()).replace("NAME", player)); } } und hier die klasse über die ich auf die datenbank zugreife package de.n3yut9j.Utils; import java.io.File; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class DB { private final String url; public DB(String datei) { url = "jdbc:sqlite:" + new File(datei).getAbsolutePath(); initDriver("org.sqlite.JDBC"); } private void initDriver(final String driver) { try { Class.forName(driver); } catch (Exception ex) { System.out.println("Datenbank Treiberfehler:" + ex.getMessage()); } } public ResultSet query(final String query) { try { Connection connection = DriverManager.getConnection(url); PreparedStatement statement = connection.prepareStatement(query); if (statement.execute())return statement.getResultSet(); } catch (SQLException ex) { System.out.println("Datenbank Fehler: "+ex.getMessage()); } return null; } public void closeconection(){ try{ Connection connection = DriverManager.getConnection(url); connection.close(); }catch(SQLException exe){ System.out.println("Datenbank Close Fehler: "+exe.getMessage()); } } } und das ist der tabel private void CreateTabels(){ db.query("CREATE TABLE IF NOT EXISTS `users` (`uuid` varchar(40) NOT NULL,`name` varchar(20) NOT NULL,`ip` varchar(50) NOT NULL);"); } und so füge ich die Spieler ein(im joinevent) try{ ResultSet rs = Main.db.query("SELECT * FROM users WHERE uuid='"+ e.getPlayer().getUniqueId().toString()+"';"); if(rs.next()) { if(!rs.getString("name").equals(e.getPlayer().getName())) { Main.db.query("UPDATE users SET name='"+e.getPlayer().getName()+"' WHERE uuid='"+e.getPlayer().getUniqueId().toString()+"';"); } if(!rs.getString("ip").equals(e.getPlayer().getAddress().getAddress().getHostAddress())) { Main.db.query("UPDATE users SET ip='"+e.getPlayer().getAddress().getAddress().getHostAddress()+"' WHERE uuid='"+e.getPlayer().getUniqueId().toString()+"';"); } }else { Main.db.query("INSERT INTO users (uuid,name,ip) VALUES ('"+e.getPlayer().getUniqueId().toString()+"','"+e.getPlayer().getName()+"','"+e.getPlayer().getAddress().getAddress().getHostAddress()+"');"); } }catch(Exception ex){ex.printStackTrace();} die datenbank wird erstellt und funktioniert beim ersten Spieler aber beim zweiten get es nicht mehr auch beim joinen bekomme ich den fehler Datenbank Fehler: [SQLITE_BUSY] The database file is locked (database is locked) wenn ihr wisst an was es liegen könnte schreibt es mir bitte Link to comment Share on other sites More sharing options...
ZusatzName Posted July 13, 2017 Share Posted July 13, 2017 Da ist ein pw drauf Link to comment Share on other sites More sharing options...
Yuki Posted July 13, 2017 Share Posted July 13, 2017 Hi, Zitat database is locked die Meldung bekommst du normalerweise dann, wenn die Datenbank bereits geöffnet ist und du noch einmal versuchst auf diese zuzugreifen. Schau mal, dass wirklich nur eine geöffnete Verbindung zur Datenbank vorhanden ist. Ansonsten kannst du auch mal testen "maxactive" auf 1 zu setzen, ob dir das eventuell hilft. -Yuki Link to comment Share on other sites More sharing options...
TheRedCraft Posted July 13, 2017 Author Share Posted July 13, 2017 vor 1 Stunde schrieb Yuki: Hi, die Meldung bekommst du normalerweise dann, wenn die Datenbank bereits geöffnet ist und du noch einmal versuchst auf diese zuzugreifen. Schau mal, dass wirklich nur eine geöffnete Verbindung zur Datenbank vorhanden ist. Ansonsten kannst du auch mal testen "maxactive" auf 1 zu setzen, ob dir das eventuell hilft. -Yuki ok aber wie ich kenne mich noch nicht so mit sqlite aus und habe das aus einen video aus youtube Link to comment Share on other sites More sharing options...
Joey Posted July 13, 2017 Share Posted July 13, 2017 Du hast in deiner Klasse ja schon die passende Methode "closeconection". Führe die einfach nach jedem query aus. So wie du es aktuell hast, baust du für jedes Statement eine Verbindung auf, schließt diese aber nicht. Mfg, Joey Link to comment Share on other sites More sharing options...
TheRedCraft Posted July 13, 2017 Author Share Posted July 13, 2017 (edited) vor 24 Minuten schrieb Joey: Du hast in deiner Klasse ja schon die passende Methode "closeconection". Führe die einfach nach jedem query aus. So wie du es aktuell hast, baust du für jedes Statement eine Verbindung auf, schließt diese aber nicht. Mfg, Joey also so package de.n3yut9j.Utils; import java.io.File; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class DB { private final String url; public DB(String datei) { url = "jdbc:sqlite:" + new File(datei).getAbsolutePath(); initDriver("org.sqlite.JDBC"); } private void initDriver(final String driver) { try { Class.forName(driver); } catch (Exception ex) { System.out.println("Datenbank Treiberfehler:" + ex.getMessage()); } } public ResultSet query(final String query) { try { Connection connection = DriverManager.getConnection(url); PreparedStatement statement = connection.prepareStatement(query); if (statement.execute())return statement.getResultSet(); closeconection(); } catch (SQLException ex) { System.out.println("Datenbank Fehler: "+ex.getMessage()); } return null; } public void closeconection(){ try{ Connection connection = DriverManager.getConnection(url); connection.close(); }catch(SQLException exe){ System.out.println("Datenbank Close Fehler: "+exe.getMessage()); } } } ??? Edited July 13, 2017 by TheRedCraft Link to comment Share on other sites More sharing options...
Joey Posted July 13, 2017 Share Posted July 13, 2017 Jaein. das closeconnection muss zwischen dem Statement.execute() und dem return Statement.getResult(). Nachdem return wir ja nichts mehr ausgeführt. Warum probierst du sowas nicht einfach mal aus? Geht meistens schneller, als zu fragen, ob das so richtig ist. Wenns nicht geht, wirst du es schon merken Mfg, Joey Link to comment Share on other sites More sharing options...
TheRedCraft Posted July 13, 2017 Author Share Posted July 13, 2017 danke ich teste es mal Link to comment Share on other sites More sharing options...
TheRedCraft Posted July 13, 2017 Author Share Posted July 13, 2017 ich habs jetzt so public ResultSet query(final String query) { try { Connection connection = DriverManager.getConnection(url); PreparedStatement statement = connection.prepareStatement(query); if (statement.execute()) closeconection(); return statement.getResultSet(); } catch (SQLException ex) { System.out.println("Datenbank Fehler: "+ex.getMessage()); } return null; } public void closeconection(){ try{ Connection connection = DriverManager.getConnection(url); connection.close(); }catch(SQLException exe){ System.out.println("Datenbank Close Fehler: "+exe.getMessage()); } } Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now