Jump to content

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


TheRedCraft
 Share

Recommended Posts

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

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

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

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

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 by TheRedCraft
Link to comment
Share on other sites

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

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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...
B