2016-09-15 5 views
1

Я создал java-программное обеспечение, использующее базу данных sqlite. Вся база данных работает плавно, однако после того, как некоторое время запуска приложения Я reveiving следующего сообщения (от попытки поймать блок):SQLITE_BUSY база данных заблокирована java

java.sql.SQLException: [SQLITE_BUSY] файл базы данных блокируются (база данных заблокировано)

Я решил свои проблемы, закрыв программное обеспечение каждый раз, когда возникло исключение. Однако есть ли способ закрыть мою базу данных, чтобы не закрывать программное обеспечение каждый раз?

Я ве получило много запросов, однако мои Пробы всегда возникают в определенной точке:

 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 полезен для небольших локальных приложений, в этом случае Singleton достаточно, чтобы предотвратить блокировку. Если в приложении есть несколько потоков, это решит ваши проблемы. Я бы сказал, что вы забыли закрыть где-то соединение. Я использовал его в старом приложении, не имея подобных проблем. – AxelH

+0

Кажется, что эта ошибка возникает, когда я пытаюсь получить доступ к определенной таблице. Так моя проблема в том, что у меня есть запрос запроса, который я никогда не закрывал где-то? –

+0

Моя проблема возникает в конкретном вопросе каждый раз, я не знаю, почему! –

ответ

1

Ваша попытка поймать неправильно, вы пытаетесь закрыть ResultSet и Statemnt в блоке try вместо блока finally. Это может привести к утечке.

Вы должны сделать это вот так, в конце концов.

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

Или вы можете посмотреть Try-with-resource.

Это может быть причиной.

+0

Так должен ли я делать то же самое для каждого запроса, который у меня есть в моем коде? –

+0

Если это не причина, то причиной может быть «connectionUser». (имя не обнадеживает, так как для всего приложения должно быть только 1 соединение) – AxelH

+0

Есть ли способ получить то, что именно вызывает мою проблему? –

0

Сортировка дубликата существующего вопроса, но this is a good starting point. Поскольку SQLite - это просто библиотека, которая читает и записывает файл в файловой системе, а не полную базу данных SQL, вы должны иметь только одно подключение к нему одновременно. В противном случае довольно легко попасть в состояние гонки.

Для локального тестирования это должно быть хорошо, но для системы любой сложности, ожидающей нескольких пользователей, вы должны использовать что-то вроде Postgre или MySQL.

+0

Да, я знаю об этом. Однако иногда проблема заключается в том, что она запускает только один экземпляр моего программного обеспечения. Однако у меня есть несколько запросов на выбор и обновление. Проблема возникает в конкретной таблице. Могу ли я каким-либо образом контролировать доступ к этой таблице моей базы данных? –

+0

Использование MySql для приложения, необходимое для его установки, не лучший выбор, если вы просто хотите сохранить в локальном файле некоторые данные с использованием синтаксиса SQL. – AxelH