База данных заблокирована в SQLite [Java]

обновлено

try
        {
            sqlite.setDbPath(dbPath);
            con = sqlite.connect();
            if (!con.isClosed()) 
            {
                String query = "SELECT Username,Password FROM Apps WHERE Username ='"+username+"'"; // and Password='"+password+"'";
                ResultSet rs = con.createStatement().executeQuery(query);
                while(rs.next())
                {
                        if (rs.getString("Username").equals(username))//confronto se Username è gia esistente
                        {
                            trovato = true;
                            risultato = "gia' presente";
                        }
                }

                if (trovato==false) {
                    createUsers(username,password,name,surname,email,appname,ip,authorized,token);
                    risultato = "inserito";
                }

                if (con!=null)
                {
                    con.close();
                }
                if (sqlite != null)
                {
                    sqlite.close();
                }
                if (rs != null)
                {
                    rs.close();
                }
            }

В блоке try catch я открыл соединение со встроенной базой данных, но в первый раз я не закрываю все соединения. С помощью if control программа закрывает все открытые соединения и работает хорошо

У вас открыта база данных в каком-нибудь редакторе sql? Это, вероятно, вызовет такую ​​ошибку.

Mark 03.01.2019 12:21

Я пытаюсь закрыть sqleditor, но у меня та же проблема

luca pellegrini 03.01.2019 12:26

IIRC SQLite позволяет только одно соединение с базой данных, поэтому, если у вас есть несколько соединений, это не удастся. Однако это может быть ограничением более старых версий, поэтому в этом случае вам может потребоваться обновить версию sqlite, которую вы используете. Тем не менее, на мой взгляд, SQLite не совсем подходящая база данных для веб-приложения.

Mark Rotteveel 03.01.2019 15:13

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

Mark Rotteveel 03.01.2019 15:15

Кстати: con.createStatement().close(); не имеет смысла. Вам не нужно создавать выписку, если вы собираетесь ее сразу закрыть.

Mark Rotteveel 03.01.2019 15:16

Я обновляю код, но он не работает

luca pellegrini 03.01.2019 15:38

Вы по-прежнему не используете try-with-resources.

Mark Rotteveel 03.01.2019 15:41

@MarkRotteveel, теперь все в порядке?

luca pellegrini 03.01.2019 15:46

Прочтите ссылку о пробных ресурсах. Вы все еще не пользуетесь им.

Mark Rotteveel 03.01.2019 15:47

Я обновил свой ответ, добавив в него версию "попробовать с ресурсом"

Joakim Danielson 03.01.2019 15:48

Я обновляю код, все в порядке?

luca pellegrini 03.01.2019 16:02

Снимаем внешний try{} catch{}

Joakim Danielson 03.01.2019 16:28

@JoakimDanielson хорошо, готово

luca pellegrini 03.01.2019 16:35

Не работает

luca pellegrini 03.01.2019 16:36
if (trovato==false) { String query1 = "INSERT INTO Apps (Username,Password,Name,Surname,Email,AppName,Ip,Authorized,‌​Token) VALUES ('" + username + "'," + "'" +password +"','" + name + "','" + surname + "','" +email + "','" + appname + "','"+ip+"','"+authorized+"','"+token+"')"; System.out.println(query1); //con.createStatement().execute(query1); con.createStatement().executeUpdate(query1); System.out.println("inserito"); }
luca pellegrini 03.01.2019 16:38

На мой взгляд, я делаю ошибку в этой части кода ... потому что сначала, если условие, код работает хорошо

luca pellegrini 03.01.2019 16:39
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
16
140
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Обновление 2

Вот сокращенная версия, в которой вместо этого используется try-with-resource. Код проще и короче

public String RegisterUser(... ) {
    boolean trovato = false;
    int authorized=0;

    SqliteConnection sqlite = new SqliteConnection();
    String dbPath = "C:/Users/l.pellegrini/eclipse-workspace/ClayAPI_dbembedded/claydb.db";
    String query = "SELECT Username,Password FROM Apps WHERE Username ='"+username+"' and Password='"+password+"'";

    try (java.sql.Connection con = sqlite.connect();
         Statement statement = con.createStatement();
         Statement updStatement = con.createStatement();
         ) {
        ResultSet rsActiveServices = con.createStatement().executeQuery(query);
        // handle result set as before
    } catch(SQLException e) {
        e.printStackTrace();
        System.out.println("errore" + e);
    }
    if (trovato==false) {
        createUser(username, password, name, surname, appname, email, ip)
    }
    return "username: " + username;
}


private createUser(String username, String password, String name, String surname, String appname, String email, String ip {
    String query1 = "INSERT INTO Apps (Username,Password,Name,Surname,Email,AppName,Ip,Authorized,Token) VALUES ('" + username + "'," + "'" +password +"','" + name + "','" + surname + "','" +email + "','" + appname + "','"+ip+"','"+authorized+"','"+token+"')";         
    SqliteConnection sqlite = new SqliteConnection();
    String dbPath = "C:/Users/l.pellegrini/eclipse-workspace/ClayAPI_dbembedded/claydb.db";

    try (java.sql.Connection con = sqlite.connect();
         Statement statement = con.createStatement();) {
        updStatement.executeUpdate(query1);
    } catch(SQLException e) {
        e.printStackTrace();
        System.out.println("errore" + e);
    }
}

Вполне может быть, что ваш подготовленный оператор не закрыт должным образом. Изменять

ResultSet rsActiveServices = con.createStatement().executeQuery(query);

к

statement = con.createStatement();
ResultSet rsActiveServices = statement.executeQuery(query);

где заявление объявлено перед try

java.sql.Connection con = null;
Statement statement = null;

а затем закройте его в своем предложении finally

finally
{
    try
    {
        statement.close();
        con.close();
        sqlite.close();
    }

Обновление 1

Я только что заметил, что вы дважды пытаетесь закрыть свои объекты, что неправильно, удалите первый набор вызовов close и закройте только в finally {} в конце.

finally { try { statement.close(); con.close(); sqlite.close(); } я не могу поставить statement.close (); наконец
luca pellegrini 03.01.2019 14:34

@lucapellegrini, моя простая ошибка. Вам необходимо объявить переменную вне предложения try. Я обновлю ответ

Joakim Danielson 03.01.2019 15:08

Вероятно, лучше (и короче) использовать try-with-resources.

Mark Rotteveel 03.01.2019 15:14

@MarkRotteveel Я знаю, но это был самый простой способ двигаться вперед.

Joakim Danielson 03.01.2019 15:27

@MarkRotteveel свяжите мне страницу

luca pellegrini 03.01.2019 15:39

@lucapellegrini Я обновил свой ответ, добавив пробную версию с ресурсом

Joakim Danielson 03.01.2019 15:46

Вы вносите соответствующие изменения: да, вверху и в конце.

Joakim Danielson 03.01.2019 15:50

@lucapellegrini попробуйте переместить создание второго оператора в то же место, что и другие (я обновлю свой ответ) или, что еще лучше, переместите его в другой метод (вместе со всем остальным кодом try-with-resource.

Joakim Danielson 03.01.2019 16:44

@JoakimDanielson хорошо, я стараюсь

luca pellegrini 03.01.2019 17:26

@JoakimDanielson Я обновляю код, но он не работает ... консоль показывает ту же ошибку

luca pellegrini 03.01.2019 17:38

@lucapellegrini переместите обновление в отдельный метод и вызовите его в конце текущего метода, если trovato имеет значение false

Joakim Danielson 03.01.2019 17:46

@JoakimDanielson, я не понимаю ... приведите пример, пожалуйста

luca pellegrini 03.01.2019 18:25

@lucapellegrini Я привел пример. Обратите внимание, что это написано прямо здесь, поэтому не компилируется и не проверяется синтаксис.

Joakim Danielson 03.01.2019 18:37

Решено

Я делаю ошибки при открытии и закрытии соединения в Main .. С SQLite соединение, которое вы должны открывать и закрывать каждый раз, когда выполняется запрос любого типа (Insert, Delete, Update и т. д.)

Другие вопросы по теме