Ucanaccess 太慢了

Posted

技术标签:

【中文标题】Ucanaccess 太慢了【英文标题】:Ucanaccess is too slow 【发布时间】:2016-04-27 08:03:07 【问题描述】:

我已正确添加了所有必要的 JARS:

Ucanaccess 3.0.4 commons-lang-2.6 commons-logging-1.1.1 hsqldbd jackcess-2.1.3

我的数据库是 100MB。仅使用 Jacksess 时,相同的查询需要 4-5 秒,而这一查询大约需要 1-2 分钟。我做了一些研究,发现 Ucanaccess 镜像了整个数据库。我怎样才能禁用它?还是有必要?

我也尝试了参数(内存、singleConnection、skipIndexes),但它没有改变任何东西。

我必须使用 UcanAccess,因为我想使用 JasperReports。为此,我需要一个有效的连接。

我的代码:

        try 
        Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
        String connectionURL = "jdbc:ucanaccess://P:/myDatabase.accdb";
        Connection conn = DriverManager.getConnection(connectionURL, "", "");
        Statement stmt = conn.createStatement();

        String query =
                "Select * from REQ_ACQ_ACQUISITIONS";


        ResultSet rs = stmt.executeQuery(query);
        while ( rs.next() ) 
            int numColumns = rs.getMetaData().getColumnCount();
            for ( int i = 1 ; i <= numColumns ; i++ ) 
                if (i > 1) System.out.print(",  ");
                String columnValue = rs.getString(i);
                System.out.print(columnValue + " " + rs.getMetaData().getColumnName(i));
            
            System.out.println("");
        
     catch (ClassNotFoundException e) 
        // TODO Auto-generated catch block
        e.printStackTrace();
     catch (SQLException e) 
        // TODO Auto-generated catch block
        e.printStackTrace();
    

【问题讨论】:

执行时很慢:Connection conn = DriverManager.getConnection(connectionURL, "", ""); P: 是网络共享的映射驱动器号吗?如果是这样,您可以尝试将数据库文件复制到本地硬盘并在此处打开以比较执行时间吗? 亲爱的 Gord,它确实是一个映射驱动器。但是我在本地尝试过,响应完全一样(如果可能的话甚至更慢?) 【参考方案1】:

请注意,这并不是真正的“连接时间”,而是整个 JVM 生命周期中第一次连接的时间。所以这是一个启动时间,类似于数据库启动时间。以下所有连接都是瞬时的。有几种方法可以显着减少第一次连接的时间。最简单的方法是构建一个过滤器数据库,将报表所需的唯一表链接为外部表。

【讨论】:

您好 Jamadei,您将如何继续这样做?你认为它必须在 Ucanaccess 中完成吗? 不,绝对,它已经工作了。您只需要创建(使用 ms 访问)一个新的访问数据库和必须指向原始数据库中原始数据库的链接表(请参阅外部数据)。然后你必须通过 ucanaccess 连接新创建的数据库。 问题是我不想增加数据库——尤其是因为我不知道要使用多少表(可能全部)。另外,我无法在这台(商业)计算机上安装 Access。假设我只想通过 java 解决问题。 @pathat0r - 对您的一些 cmets 的回复:“我不知道我将使用多少张表(可能全部)。” 然后你'将需要镜像所有这些。 “另外,我无法在这台(企业)计算机上安装 Access。” 所以您有使用 Access 数据库的实际业务需求,但您不能使用 Access 软件?那真不幸。 “我必须使用 UcanAccess,因为我想使用 JasperReports。” 不一定。您还可以使用 Java 7 和 Java 自己的 JDBC-ODBC 桥,或者您可以使用其他一些(商业?)JDBC 驱动程序或 JDBC-ODBC 桥解决方案。 So it's a startup time, something like a database startup time. 是的...正如您所说...第一个连接很慢,但其余时间(只要我们保留打开的连接的引用)数据库连接/事务非常快【参考方案2】:

对我来说,我遇到了类似的问题,但主要是因为在我的整个代码中,我从未在运行查询后关闭我的连接。

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于Ucanaccess 太慢了的主要内容,如果未能解决你的问题,请参考以下文章

UCanAccess - 使用 keepMirror 后无法重新连接到 Access 数据库

使用 UCanAccess 的 MS Access '97 DB 字符集

iPad 中的洪水填充太慢了

如何在 UCanAccess 中设置 MS Access 数据库路径?

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

sqlmap太慢了