sqlite не может подключиться к базе данных ошибка: java .lang.UnsatisfiedLinkError: org.sqlite.core.NativeDB._open_utf8 ([BI) V - PullRequest
0 голосов
/ 26 мая 2020

Я получаю следующую ошибку: У меня есть этот код. Я пробовал несколько вещей, прежде чем опубликовать это, я определил, что это исходная ошибка, при которой он не подключился к базе данных. Я запускаю этот код в Tomcat как серверную базу данных для микросервиса. Он пытается подключиться к моему временному каталогу, по какой-то причине у него нет доступа. Я использую

System.setProperty("java.io.tmpdir", "C:\\Dev\\temp");

, он записывает файл dll в это место. но он не подключается к базе данных. Он должен сначала создать базу данных, если ее там нет

Caused by: **java.lang.UnsatisfiedLinkError: org.sqlite.core.NativeDB._open_utf8([BI)V**
at org.sqlite.core.NativeDB._open_utf8(Native Method)
at org.sqlite.core.NativeDB._open(NativeDB.java:78)
at org.sqlite.core.DB.open(DB.java:202)
at org.sqlite.SQLiteConnection.open(SQLiteConnection.java:243)
at org.sqlite.SQLiteConnection.<init>(SQLiteConnection.java:61)
at org.sqlite.jdbc3.JDBC3Connection.<init>(JDBC3Connection.java:28)
at org.sqlite.jdbc4.JDBC4Connection.<init>(JDBC4Connection.java:21)
at org.sqlite.JDBC.createConnection(JDBC.java:115)
at org.sqlite.JDBC.connect(JDBC.java:90)
at java.sql.DriverManager.getConnection(DriverManager.java:664)
at java.sql.DriverManager.getConnection(DriverManager.java:270)java.lang.UnsatisfiedLinkError: org.sqlite.core.NativeDB._open(Ljava/lang/String;I)V

Когда я пытаюсь подключиться к базе данных sqlite, я получаю указанную выше ошибку

Failed to load native library:sqlite-3.31.1-0d2f436c-54b0-48ed-8a6b-044f659f50d6-sqlitejdbc.dll. osinfo: Windows/x86_64
java.lang.UnsatisfiedLinkError: C:\Users\home\AppData\Local\Temp\sqlite-3.31.1-0d2f436c-54b0-48ed-8a6b-044f659f50d6-sqlitejdbc.dll: Access is denied

Мой базовый код:

publi c class Database {

private static Database instance = new Database();
 Connection conn = null;
 Statement stmt = null;

private Database() { 
    getInstance();
}

public static Database getInstance() {
    return instance;
}

public Connection dbConnection() {

    String createTableQuery = "CREATE TABLE IF NOT EXIST fileBlock (pid not null, filename not null, PRIMARY KEY(pid,filename))";
    try {
        //create database if not exist and then connect
        Class.forName("org.sqlite.JDBC");
        conn = DriverManager.getConnection("jdbc:sqlite:blockedFiles.db");
        //verify table exist if not create it
        stmt = conn.createStatement();
        stmt.execute(createTableQuery);
        return conn;            
    }
    catch(Exception e){
        return null;
    }
}

public void closeConnection() {
    try {
        conn.close();
    }
    catch(Exception e) {}   
}

}

Моя реализация

 Connection conn = Database.getInstance().dbConnection();
    if(conn != null ) {
        System.out.println("true");         
    }
    else {
        System.out.println("false");
    }       
    Database.getInstance().closeConnection();

1 Ответ

0 голосов
/ 20 августа 2020

Я обнаружил, что это в основном проблема с разрешениями на локальном компьютере.

Как мне удалось обойти это, было использование класса SQLiteConfig.

Этот класс позволяет вам передать параметры конфигурации. Параметры, которые я добавил в класс подключения к базе данных:

 SQLiteConfig config = new SQLiteConfig();
  // config.setCacheSize(cache_size);
   config.setBusyTimeout(30000);
   config.setSynchronous(SynchronousMode.NORMAL);
   config.setTempStore(TempStore.MEMORY);
   config.setTempStoreDirectory("some path, I used same as java.io.tmpdir");
   config.setJournalMode(JournalMode.MEMORY);
 //create database if not exist and then connect
    Class.forName("org.sqlite.JDBC");
    conn = DriverManager.getConnection("jdbc:sqlite:blockedFiles.db", config.toProperties());
    //verify table exist if not create it
    stmt = conn.createStatement();
    stmt.execute(createTableQuery);
    return conn;

Перед подключением к базе данных я сказал ему загрузить драйверы в память, а файл журнала (WAL) также находится в памяти.

...