amanuelhaft Ответов: 0

Блокировка базы данных Sqlite


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





package sqlwrapper;

import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class SqLiteSQLWrapper implements SQLWrapper {

private final String driver = "SQLite.JDBCDriver";
private final String protocol = "jdbc:sqlite:";
private final String dbName = "toolbox.dat";
private String dbPath = null;

private Connection conn = null;

/**
 * Single instance created upon class loading.
 */

private static final SqLiteSQLWrapper sqLiteInstance = new SqLiteSQLWrapper();

private SqLiteSQLWrapper() {
}

/**
 * Returns the singleton sqLite instance
 * @return sqLiteInstance
 */
public static SqLiteSQLWrapper getInstance() {

    try{
        if(sqLiteInstance.conn == null || sqLiteInstance.conn.isClosed())
            sqLiteInstance.conn = sqLiteInstance.getConnection();

    }catch(Exception ex){
        ex.printStackTrace();
        return null;
    }

    return sqLiteInstance;
 }

/**
 * Execute SQL statement for data definition and manipulation
 * @param sql Sql operation
 * @return success of executed operation
 */

public boolean execute(String sql) {
    Statement st = null;
    try {
        st =sqLiteInstance.conn.createStatement();
        boolean successful = st.execute(sql);
        st.close();
        return successful;
    } catch (SQLException e) {
        e.printStackTrace();
        return false;
    } finally {
        try {
            st.close();
        } catch(Exception e) {}
    }
}

/**
 * Execute SQL statement for data query
 * @param sql Sql operation
 * @return queryResult
 */

public QueryResult executeQuery(String sql) {

    QueryResult result = null;

    try {
        Statement st =sqLiteInstance.conn.createStatement();
        result = new QueryResult(st, sql);
    } catch (Exception e) {
        e.printStackTrace();
    }

    return result;
 }


 /**
 * Commit transaction
 */

public void commit() {
    try {
        conn.commit();
    } catch(SQLException e) {
        e.printStackTrace();
    }
}


/**
 * Commit transaction, delete temporary data
 * @return success of the operation
 */

public boolean flush() {
    try {
        conn.commit();
        conn.close();

        String dbPath = sqLiteInstance.dbPath +"/" +sqLiteInstance.dbName;
        File file = new File(dbPath);
        boolean succ = file.delete();

        if(succ){
            File dir = new File(sqLiteInstance.dbPath);
            dir.delete();
        }

    } catch (SQLException e) {
        e.printStackTrace();
        return false;
    }
    return true;
}

private Connection getConnection() throws SQLException {

    loadDriver();

    //if(sqLiteInstance.dbPath == null){

        sqLiteInstance.dbPath= System.getProperty("user.home") + "/.Toolbox" ;

        if (!(new File(sqLiteInstance.dbPath)).exists()){
                boolean success = (new File(sqLiteInstance.dbPath)).mkdir();
                if(!success)
                    return null;
        }

    //}

    conn = DriverManager.getConnection( sqLiteInstance.protocol + "/" + sqLiteInstance.dbPath +"/" +sqLiteInstance.dbName , "", "" );
    conn.setAutoCommit(false);

    return conn;
}

private void loadDriver() throws SQLException {
    try {
        System.loadLibrary("sqlite_jni");
       //Class.forName(sqLiteInstance.driver);
       Class.forName("org.sqlite.JDBC");

    } catch (ClassNotFoundException cnfe) {
        System.err.println("\nUnable to load the JDBC driver ");
        System.err.println("Please check your CLASSPATH.");
        cnfe.printStackTrace(System.err);
    }
}
}


**затем он отобразит сообщение об ошибке**





org.sqlite.SQLiteException: [SQLITE_LOCKED]  A table in the database is 
    locked (database table is locked)
	    at org.sqlite.core.DB.newSQLException(DB.java:909)
	    at org.sqlite.core.DB.newSQLException(DB.java:921)
	    at org.sqlite.core.DB.execute(DB.java:822)
	    at org.sqlite.core.CoreStatement.exec(CoreStatement.java:75)
	    at org.sqlite.jdbc3.JDBC3Statement.execute(JDBC3Statement.java:61)
	    at sqlwrapper.SqLiteSQLWrapper.execute(SqLiteSQLWrapper.java:60)



тогда как я могу решить эту проблему ? база данных sqlite заблокирована

Что я уже пробовал:

я пытаюсь отобразить результат

Richard MacCutchan

Что такое строки 60 и 61?

amanuelhaft

Строка 60 является частью этого кода

56 public boolean execute(String sql) {
57 оператор st = null;
58 попробуй {
59 st =sqLiteInstance.conn.createStatement();
60 логическое успешно = ст.выполнить(для SQL);
Ст 61.рядом();
62 возвращение успешно;
63 } catch (SQLException e) {
64 e.printStackTrace();
65 возвращать false;
66 } наконец-то {
67 попробовать {
Ст 68.рядом();
69 } catch(исключение e) {}
70 }


Но строка 61 является частью пакета Sqlite

Richard MacCutchan

Затем вам нужно проследить назад от последнего звонка, чтобы узнать, где был заблокирован стол.

amanuelhaft

хорошо, сэр, Спасибо за ваш ответ !

Richard Deeming

public boolean execute(String sql)
public QueryResult executeQuery(String sql)

Эти методы заставят вас написать код, который уязвим для SQL-инъекция[^]. НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.

Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов | OWASP[^]

0 Ответов