You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

运行.jar文件时SQLite数据库无法更新的问题排查

数据库打包JAR后无法更新的问题及代码优化咨询

问题详情

  • 类DbHelper封装所有数据库操作,已实现通用插入方法以减少代码重复。
  • 在IDE中通过Launcher主类运行时,数据库可正常执行更新操作;但打包为.jar文件运行时,仅能读取数据,更新操作无法保存。
  • 已尝试将所有更新方法的autocommit设为true(从未显式设为false),且确保ResultSet使用后关闭,但问题仍存在。两种运行方式下数据库连接con均不为空,推测数据库处于只读状态。

数据库连接代码

public static Connection getConnection() {
    try {
        Class.forName("org.sqlite.JDBC"); // 加载SQLite JDBC驱动
        String databaseUrl;
        // 运行.jar文件时使用
        databaseUrl = "jdbc:sqlite::resource:ttlsDatabase.db";

        // IDE中运行时使用(注释掉上面的资源路径)
        // databaseUrl = "jdbc:sqlite:C:\\Users\\medaw\\Desktop\\TTLS_APP\\src\\main\\Resource\\ttlsDatabase.db";

        Connection databaseLink = DriverManager.getConnection(databaseUrl);
        return databaseLink;
    } catch (ClassNotFoundException e) {
        System.err.println("未找到SQLite JDBC驱动,请确保已将其添加到项目类路径中。");
    } catch (SQLException e) {
        System.err.println("数据库操作出错:" + e.getMessage());
    }
    return null;
}

注:运行.jar时注释本地路径代码,IDE运行时注释资源路径代码。

通用更新方法(寻求优化建议)

该方法适用于所有单条查询的更新操作:

public static boolean updateDatabase(ArrayList<Object> list, String query){
    try (Connection con = getConnection()) {
        con.setAutoCommit(true);

        PreparedStatement stmt = con.prepareStatement(query);
        stmt = setStatements(stmt, list);
        if (stmt == null) {
            return false;
        }

        int x = stmt.executeUpdate();
        if(x == 0){
            return false;
        }
        con.commit();

        return true;
    } catch (Exception e) {
        UtilityMethods.showMessageDialog("无法更新条目!", "错误!", "更新失败", 1);
    }
    return false;
}

项目目录结构

项目采用标准Maven目录结构,数据库文件ttlsDatabase.db存放于src/main/resources目录下。


内容的提问来源于stack exchange,提问作者sammy medawar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 11:23:15