【问题标题】:Connecting to access database from linux从linux连接访问数据库
【发布时间】:2011-08-10 04:24:10
【问题描述】:

我已经创建了我的应用程序并在 Windows 下对其进行了测试,该应用程序向访问数据库文件写入/读取数据。

但在现实世界中它会在linux环境中运行,我现在有一个大问题,似乎没有驱动linux访问ms acess db,这是我现在建立连接的方法:

private static Connection getConnection() {
        if (connection == null) {
            try {
                Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
                String conStr = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=" + configuration.getAccessDbFile();
                connection = DriverManager.getConnection(conStr);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return connection;
    }

有没有人遇到类似的情况,有没有人建议我该怎么办?

这是我在 linux 上遇到的异常:

java.lang.NullPointerException
        at sun.jdbc.odbc.JdbcOdbcDriver.initialize(JdbcOdbcDriver.java:436)
        at sun.jdbc.odbc.JdbcOdbcDriver.connect(JdbcOdbcDriver.java:153)
        at java.sql.DriverManager.getConnection(DriverManager.java:582)
        at java.sql.DriverManager.getConnection(DriverManager.java:207)

【问题讨论】:

    标签: java linux ms-access


    【解决方案1】:

    在 Linux 上运行的应用程序访问 MS Access 数据库或使用 ODBC 并不常见。 ODBC 是一种 Windows 技术。 linux 有一些选择,但这不是一个常见的场景。

    正如您所发现的,您的 linux 机器上没有 Access ODBC 驱动程序,因此 JDBC-ODBC 桥接失败。您可能能够安装合适的 ODBC 驱动程序,但我不知道有任何免费或开源的驱动程序。 Linux 的事实上的 ODBC 选项是:

    基于UnixODBC的Access商业驱动:

    可以连接到 Access 数据库的 4 类 JDBC 驱动程序:

    我对这些都没有亲身经历。类型 4 JDBC 驱动程序将是理想的,但我怀疑它是否像宣传的那样完美。

    (我相信你有理由,但如果你计划部署到 Linux 机器,我想知道你为什么要使用 Access 数据库。我相信让 Java 应用程序使用 Access 数据库的唯一充分理由是如果它是一个现有的 Access 应用程序,其自定义编程用于 Java 应用程序之外的目的。否则,有许多更好的选择。还要考虑如果您使用 Access 的主要原因只是为了您可以将 Access 用作用户友好用于表单和报告的 GUI 工具,您仍然可以将数据存储在限制较少的数据库(Derby、SQLLite、MySQL、PostgreSQL、MS SQL Server 等)中,然后通过 ODBC 从 Access 连接到数据库。)这将允许您部署您在 Linux 上的 Java 应用程序,您的数据库在任何地方都最有意义,并且仍然使用 Access 从 Windows 连接到数据库。我已经这样做了很多次了。)

    【讨论】:

    • 大多数开发人员在这种情况下会做的第一步是导出 Access 数据库并将其导入合理的数据库,例如 MySQL。请参阅databases.aspfaq.com/database/… 了解为什么不应将 Access 用于任何“真实”事物的各种意见。
    • @wallyk:“真实”是什么意思? Linux 应用程序?如果是这样,我会同意这一点。网络应用?如果是这样,是的,我同意这一点。但是有大量的应用程序,Access/Jet/ACE 是一个非常合适的工具/数据存储——它和其他任何东西一样“真实”。简而言之,放弃反访问的偏见。
    • @David-W-Fenton:这不是偏执——我有数十年的开发和维护经验,可以拯救陷入 Microsoft 技术的应用程序。我所说的“真实”是指大量并发用户,根据我的经验、其他顾问和行业评论家,Access 的数量超过 3 或 4 个。对于独立应用程序访问往往是好的。但是,如果将它移植到具有多个用户自动数据输入的任何情况,Access 的并发性和可扩展性限制很快就会赶上设计。
    • 我经常使用 Jet/ACE 后端开发和维护 Access 应用程序,这些应用程序同时拥有 10-25 个用户。在高端,我通常建议计划扩大规模,特别是如果用户数量有任何增加的可能性。在低端,没有那么多。它不需要任何特别特殊的编程来使这种应用程序与如此多的用户和 Jet/ACE 后端可靠地工作——您只需要高效并且不检索比用户实际可以一次使用的更多的数据。
    • ...所以,我不明白为什么人们经常抱怨少于 5 个用户的 Access。我无法想象他们做错了什么。另一方面,自 1996 年以来,我一直在专业从事这项工作,并且阅读了很多关于优化 Access 的内容,并且努力了解数据库引擎的工作原理。我不明白为什么这么多人似乎不愿意做同样的事情。升级到不同的后端并不能修复设计不佳的应用程序设计——没有灵丹妙药。
    【解决方案2】:

    使用http://jackcess.sourceforge.net/

    您可以使用 Java 从 Linux 或 Windows 读取/写入 Access 数据库。

    【讨论】:

      【解决方案3】:

      如果您坚持使用 Access,但您与数据库文件的交互非常“简单”(例如,您没有执行复杂的 SQL 查询),您可以使用 Jackcess 之类的东西。它是一个纯 Java 库,允许您操作 Access 数据库,但它确实提供 jdbc 接口,因此您必须使用 Jackcess api 编写代码。

      (免责声明,我是jackcess开发人员)

      【讨论】:

        【解决方案4】:

        UCanAccess 是一个免费的、开源的、用于 Access 数据库的纯 Java JDBC 驱动程序。有关如何使用它的更多信息,请参阅

        Manipulating an Access database from Java without ODBC

        【讨论】:

          【解决方案5】:

          浏览此链接,这将对您有所帮助。

          http://www.neowin.net/forum/topic/887410-java-ms-access-driver-for-maclinux/

          您能否调试并告诉我们您为获取连接而传递的连接字符串是什么。因为我认为你应该如下调用 getConnection

          DriverManager.getConnection(conStr, "", "");
          

          【讨论】:

          • 我无法调试这个,我正在从可执行的 jar 中执行这个
          猜你喜欢
          • 1970-01-01
          • 2011-07-28
          • 2018-03-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多