Java - [SQLITE_BUSY] Файл базы данных заблокирован (база данных заблокирована) - PullRequest
1 голос
/ 28 мая 2020

У меня было приложение java с подключением mysql, но мне пришлось перенести мою базу данных в sqlite из mysql, потому что mysql не может быть встроено, у меня есть подключение, но я получаю это исключение, когда я с помощью приложения.

org.sqlite.SQLiteException: [SQLITE_BUSY]  The database file is locked (database is locked)

Я узнал, что это частая ошибка, но попробовал большинство ответов, но не смог решить. Проблема в том, что у меня есть около 30 различных методов с типом void или возвращаемыми типами, такими как эти 2, например, ниже; (Я вызываю эти методы в моем приложении Swing позже)

У меня они есть в начале моего класса;

private Connection con = null;
private Statement statement = null;
private PreparedStatement preparedstatement = null;

Например, методы;

public int lastPlaceProgram(){

    String query= "Select * from userprogram where laststayed = 1";
    try {
        statement = con.createStatement();
        ResultSet rs = statement.executeQuery(query);
        int programid = 0;
        while(rs.next()){
            programid = rs.getInt("programid");
        }
        return programid;
    } catch (SQLException ex) {
        Logger.getLogger(Operations.class.getName()).log(Level.SEVERE, null, ex);
        return 0;
    }

}

или

public String programType(int programid){
    String query = "Select * from programs where id = ?";
    try {
        preparedStatement = con.prepareStatement(query);
        preparedStatement.setInt(1, programid);
        ResultSet rs = preparedStatement.executeQuery();
        String type = "";
        while(rs.next()){

            type = rs.getString("type");
        }
        return type;
    } catch (SQLException ex) {
        Logger.getLogger(Operations.class.getName()).log(Level.SEVERE, null, ex);
        return null;
    }

}

Конструктор;

public Operations() {
    String url = "jdbc:sqlite:C://Users//Me//Desktop//sqlited/trying.db";
    try {
        con = DriverManager.getConnection(url);
    } catch (SQLException ex) {
        Logger.getLogger(Operations.class.getName()).log(Level.SEVERE, null, ex);
    }
    }

Я попытался добавить этот блок finally в блоки after catch всех моих 30 методов;

finally{
    try{
      con.close();
    } catch(Exception e){
    }
}

Но это не помогло ' t работает, на этот раз он выдал ошибку «Соединение закрыто». Я также пробовал добавить preparestatement.close (); в этот блок finally, но все еще не работал.

1 Ответ

0 голосов
/ 29 мая 2020

В итоге блоки у меня не работали, я закрыл их вручную, если нужно было закрыть эту переменную. Я имею в виду, что если я использовал ResultSet и PreparedStatement в методе, то я сделал rs.close () и preparestatement.close () непосредственно перед catch или перед возвратом. Если бы у меня была только переменная Preparedstatement в методе, тогда я просто выполнил preparestatement.close () перед блоком catch или перед возвратом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...