sqlite 无法连接数据库错误:java.lang.UnsatisfiedLinkError: org.sqlite.core.NativeDB._open_utf8([BI)V

问题描述 投票:0回答:3

我收到以下错误: 我有这段代码,在发布此代码之前我已经尝试了几件事,我确定这是它未连接到数据库的源错误。 我在 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

我的基本代码是:

公共类数据库{

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();
java sqlite database-connection
3个回答
1
投票

使用

tmp
指定您自己的
-Dorg.sqlite.tmpdir
路径,例如:

java -jar -Dorg.sqlite.tmpdir=./tmp {your-jar-file}.jar 

参考:https://github.com/lmenezes/cerebro/issues/121


0
投票

我发现这主要是本地机器上的权限问题。

我如何解决这个问题是使用 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)也在内存中。


0
投票

就我而言,是我的

/tmp
目录导致了问题。它超出了为其分配的存储量。为了解决这个问题,我做了以下操作:

  1. 运行
    df -h
    检查哪些目录已满。就我而言,是
    /tmp
  2. 通过
    sudo nano /etc/fstab
  3. 打开文件
  4. 通过将大小参数编辑为更大的值来增加分配给
    /tmp
    的大小。例如,更改
    tmpfs /tmp tmpfs nodev,nosuid,size=1M 0 0
    tmpfs /tmp tmpfs nodev,nosuid,size=500M 0 0

请注意,大小参数不再是 1 兆字节 (1M),但在我的例子中已扩展到 500 兆字节 (500M)。

  1. 奔跑
    sudo reboot
  2. 重新启动最初出现错误的进程。就我而言,问题已解决。

一如既往,编辑系统文件时要小心。 希望这有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.