2016-09-15 4 views
1

Ich habe eine Java-Software, die sqlite Datenbank verwenden. Die gesamte Datenbank reibungslos funktioniert jedoch nach einiger Zeit von der Ausführung der Anwendung mir die folgende Meldung am reveiving (von einem Try-Catch-Block):SQLITE_BUSY die Datenbank ist gesperrt java

java.sql.SQLException: [SQLITE_BUSY] Die Datenbankdatei gesperrt ist (Datenbank gesperrt)

Ich habe meine Probleme gelöst, indem ich die Software bei jeder Erhöhung der Ausnahme geschlossen habe. Gibt es jedoch eine Möglichkeit, meine Datenbank zu schließen, um die Software nicht jedes Mal zu schließen?

Ich habe habe viele Anfragen aber mein prob immer in einem bestimmten Punkt entsteht:

 try { 
      String query = "select * from StudentsSession where userId=? and course=? and level=?"; 
      PreparedStatement pst = connectionUsers.prepareStatement(query); 
      pst.setString(1, saveUser.getText()); 
      pst.setString(2, textSubjectQTest); 
      st.setString(3, showCurrentLevelLabel.getText()); 
      ResultSet rs = pst.executeQuery(); 
      while (rs.next()) { 
       count = count + 1; 
      } 
      pst.close(); 
      rs.close(); 

     } catch (Exception a) { 
      System.out.println(a); 
     } 
     try { 
      String countS, tmpS; 
      countS = String.valueOf(count); 
      sessionId.setText(countS); 
      long unixTime = System.currentTimeMillis()/1000L; 
      tmpS = String.valueOf(unixTime); 
      date.setText(tmpS); 
      course.setText(textSubjectQTest); 

      String query = "insert into StudentsSession (userId,date,course,level,trial,score) values (?,?,?,?,?,-1)"; 
      PreparedStatement pst = connectionUsers.prepareStatement(query); 
      pst.setString(1, saveUser.getText()); 
      pst.setString(2, tmpS); 
      pst.setString(3, textSubjectQTest); 
      pst.setString(4, showCurrentLevelLabel.getText()); 
      pst.setString(5, countS); 
      pst.executeUpdate(); 
      pst.close(); 

     } catch (Exception a) { 

      System.out.println(a); 
      System.exit(0); 
     } 

     String file1 = ""; 
     ResultSet ts4; 
     try { 

      sessionId3 = ""; 
      String query3 = "select * from studentssession where userid = ? and course = ? and level = ?"; 
      PreparedStatement pst__1 = connectionUsers.prepareStatement(query3); 
      pst__1.setString(1, saveUser.getText()); 
      pst__1.setString(2, textSubjectQTest); 
      pst__1.setString(3, showCurrentLevelLabel.getText()); 
      ts4 = pst__1.executeQuery(); 

      while (ts4.next()) { 
       sessionId3 = ts4.getString("sessionId"); 
      } 
      pst__1.close(); 
      ts4.close(); 
      obj = new CaptureVideoFromWebCamera(); 

      file1 = "videos/" + userTextFieldS.getText(); 

      file1 = file1 + "_" + sessionId3; 
      file1 = file1 + ".wmv"; 

      obj.start(file1); 

     } catch (Exception e4) { 
      e4.getCause(); 
     } 

Manchmal die Ausnahme dieser Code steigen.

+0

SQlite ist nützlich für kleine lokale Anwendung, in diesem Fall ist ein Singleton genug, um eine Sperre zu verhindern. Wenn Sie mehrere Threads in Ihrer Anwendung haben, werden Ihre Probleme dadurch gelöst. Ich würde sagen, dass du vergessen hast, deine Verbindung irgendwo zu schließen. Ich habe es in einer alten App verwendet, ohne diese Art von Problemen zu haben. – AxelH

+0

Es scheint, dass dieser Fehler auftritt, wenn ich versuche, Zugriff auf eine bestimmte Tabelle zu haben. Also mein Problem ist, dass ich eine Abfrage habe, dass ich es nie irgendwo geschlossen habe? –

+0

Mein Problem entsteht jedes Mal in einer bestimmten Abfrage, ich bin mir nicht sicher warum! –

Antwort

1

Ihr Versuch zu fangen ist falsch, Sie versuchen, die ResultSet und Statemnt im try-Block anstelle von einem endgültigen Block zu schließen. Dies könnte zu Undichtigkeiten führen.

Sie sollten es so, in der endgültigen tun.

PreparedStatement pst = null; 
ResultSet rs = null; 
try { 
     pst = connectionUsers.prepareStatement(query); 
     ... 
     rs = pst.executeQuery(); 
     ...      
    } catch (Exception a) { 
     a.printStackTrace(); 
    } finally { 
     if(rs != null){ 
      try{ 
        rs.close(); 
      } catch(Exception e){ 
       e.printStackTrace(); 
      } 
     } 
     if(pst != null){ 
      try{ 
       pst.close(); 
      } catch(Exception e){ 
       e.printStackTrace(); 
      } 
     } 
    } 

Oder Sie könnten auf die Try-with-Ressource aussehen.

Dies könnte ein Grund sein.

+0

Also sollte ich das gleiche für jede Abfrage tun, die ich in meinem Code habe? –

+0

Wenn dies nicht der Grund ist, könnte der 'connectionUser' die Ursache sein. (Der Name ist nicht beruhigend, da Sie nur eine Verbindung für die gesamte Anwendung haben sollten) – AxelH

+0

Gibt es eine Möglichkeit, herauszufinden, was genau mein Problem verursacht? –

0

Sorta Duplikat der bestehenden Frage, aber this is a good starting point. Da SQLite nur eine Bibliothek ist, die in eine Datei im Dateisystem liest und schreibt, keine vollständige SQL-Datenbank, sollte eigentlich nur jeweils eine Verbindung zu ihr geöffnet sein. Ansonsten ist es ziemlich einfach, in einen Rennzustand zu kommen.

Für lokale Tests sollte es in Ordnung sein, aber für ein System beliebiger Komplexität, das mehrere Benutzer erwartet, sollten Sie etwas wie Postgre oder MySQL verwenden.

+0

Ja, mir ist das bekannt. Manchmal jedoch tritt das Problem nur auf, wenn nur eine Instanz meiner Software ausgeführt wird. Ich habe mehrere Select einfügen und aktualisieren Sie Abfragen jedoch. Das Problem entsteht in einer bestimmten Tabelle. Kann ich irgendwie den Zugriff auf diese Tabelle meiner Datenbank kontrollieren? –

+0

Verwenden Sie MySql für eine Anwendung erforderlich, um es zu installieren, nicht die beste Wahl, wenn Sie nur einige Daten in der lokalen Datei mit der SQL-Syntax speichern möchten. – AxelH

Verwandte Themen