使用 UCanAccess 保存数据时 Java 应用程序挂起

Posted

技术标签:

【中文标题】使用 UCanAccess 保存数据时 Java 应用程序挂起【英文标题】:Java application hangs when using UCanAccess to save data 【发布时间】:2015-12-01 01:39:57 【问题描述】:

我有一个程序可以将学生信息存储到 Microsoft accesss 数据库中 我使用 ucanaccess、jre 1.8 和 jdk 1.8 但是我直接写入数据库的数据可以显示在我的程序中 但是我在程序中输入的数据无法写入数据库,它只是在我将数据保存到数据库的那一刻冻结

这是我的连接类

class myConnection
    ResultSet re;

        String strurl = "jdbc:ucanaccess://student.accdb";

    public myConnection()
    public ResultSet getResult(String sql)
        try
        Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");

            Connection conn=DriverManager.getConnection(strurl);

            Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
            ResultSet re=stmt.executeQuery(sql);
            return re;
        
        catch(Exception e)
            System.out.println("getResult------"+e.toString());
            return null;
        
    

    public boolean executeSql(String sql)
        try
        Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");

            Connection conn=DriverManager.getConnection(strurl);
            Statement stmt=conn.createStatement();
            stmt.executeUpdate(sql);
            conn.commit();
            return true;
        
        catch(Exception e)
            System.out.println("executeSql----"+e.toString());
            return false;
        
    

【问题讨论】:

您的代码有问题,没有理由打开 CONCUR_UPDATABLE 结果集,既不使用结果集更新功能,也不在呈现后关闭结果集。您只是在 dbms 上显式创建了一个锁。使用 Statement stmt=conn.createStatement()(不带参数),它会起作用。 谢谢jamadei,你帮我解决问题,我认为lock dbms是个好主意 但是现在当我将数据保存到数据库时出现问题错误-->net.ucanaccess.jdbc.UcanaccessSQLException: 用户缺少权限或找不到对象: 所以你的sql也是错误的。可以发一下吗? 【参考方案1】:

指定 ResultSet.CONCUR_UPDATABLE 并且未能关闭 ResultSet 会在所涉及的表上留下锁。由于您实际上并未更新 ResultSet,您可以简单地省略该选项(从而使用默认的 ResultSet.CONCUR_READONLY)来避免该问题。

【讨论】:

以上是关于使用 UCanAccess 保存数据时 Java 应用程序挂起的主要内容,如果未能解决你的问题,请参考以下文章

无法进行更新 java UcanAccess

UCanAccess Java 执行错误

如何将UCanAccess连接到使用数据库密码加密的Access数据库?

如何将 UCanAccess 连接到使用数据库密码加密的 Access 数据库?

UCanAccess 和 JPA 上下文中的 java.lang.***Error

不使用 UCanAccess 从 Java 8 连接到 Access 数据库