Jump to content

Datenbank Fehler: [SQLITE_BUSY] The database file is locked (database is locked)


Empfohlene Beiträge

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 zu diesem Kommentar
Auf anderen Seiten teilen

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 zu diesem Kommentar
Auf anderen Seiten teilen

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 zu diesem Kommentar
Auf anderen Seiten teilen

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 zu diesem Kommentar
Auf anderen Seiten teilen

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());
    	}
    }
}

???

bearbeitet von TheRedCraft
Link zu diesem Kommentar
Auf anderen Seiten teilen

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 zu diesem Kommentar
Auf anderen Seiten teilen

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 zu diesem Kommentar
Auf anderen Seiten teilen

Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden
×
×
  • Neu erstellen...
B
B