2016-09-15 21 views
1

私はsqliteデータベースを利用するJavaソフトウェアを作成しています。データベース全体がスムーズに動作しますが、アプリケーションを実行してからしばらくお待ちください。SQLITE_BUSYデータベースがロックされています

java.sql.SQLException:[SQLITE_BUSY]データベースファイルがロックされています(データベースはロックされています)。ロックされた)

私は、例外が発生するたびにソフトウェアを閉じることで問題を解決しました。しかし、毎回ソフトウェアを閉じないようにデータベースを閉じる方法がありますか?

私は私のPROBは、特定の時点で常に発生するが、クエリの多くを得たVEの:

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

時には、このコードは例外を上昇。

+0

SQliteは小規模なローカルアプリケーションに役立ちます。その場合、シングルトンはロックを防止するのに十分です。あなたのアプリケーションに複数のスレッドがある場合、それが問題を解決します。あなたはどこかで接続を閉じるのを忘れたと言います。私はこの種の問題を起こさずに古いアプリで使っていました。 – AxelH

+0

特定のテーブルにアクセスしようとするとこのエラーが発生するようです。だから私の問題は、私はどこかでそれを閉じたことがないクエリステートメントがあるということです? –

+0

私の問題は毎回特定のクエリで発生し、私はなぜそれがわからないのですか? –

答えて

1

tryキャッチが間違っていると、finallyブロックの代わりにtryブロックにResultSetStatemntを閉じようとします。これは漏れにつながる可能性があります。

最後に、このようにする必要があります。

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

また、リソースを試してみることもできます。

これは理由があります。

+0

私は自分のコードにあるすべてのクエリに対して同じことをする必要がありますか? –

+0

これが理由でない場合、 'connectionUser'が原因である可能性があります。 (アプリケーション全体で1つの接続しか持たないので、名前は安心しません) – AxelH

+0

正確に何が問題になるのかを検索する方法はありますか? –

0

既存の質問と重複していますが、this is a good starting pointです。 SQLiteは完全なSQLデータベースではなく、ファイルシステム上のファイルを読み書きするライブラリなので、実際には一度に1つの接続しか開いていないはずです。それ以外の場合、競争状態になるのはかなり簡単です。

ローカルテストの場合は問題ありませんが、複数のユーザーが必要な複雑なシステムの場合は、PostgreまたはMySQLのようなものを使用する必要があります。

+0

はい、私はそれについて認識しています。しかし、ときには私のソフトウェアのインスタンスを1つだけ実行するだけで問題が発生することもあります。私はいくつかの選択挿入と更新クエリを持っている。問題は特定のテーブルで発生します。データベースのそのテーブルへのアクセスを何とか制御できますか? –

+0

アプリケーションにMySqlを使用する必要があります.SQL構文を使用してローカルファイルにいくつかのデータを保存したい場合は、インストールする必要はありません。 – AxelH

関連する問題