【问题标题】:Multiple JDBC files on Eclipse projectEclipse 项目中的多个 JDBC 文件
【发布时间】:2015-07-20 04:40:57
【问题描述】:

在我的项目中,我应该同时使用 SQLiteDB 和 MariaDB。

所以,我在eclipse项目中导入了jdbc驱动文件(*.jar)。

但是我收到了这样的错误:

代码:

public DBHelper() {
    try {
        driver = (Driver) Class.forName("org.sqlite.JDBC").newInstance();
        DriverManager.registerDriver(driver);
    } catch (SQLException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (InstantiationException e) {
        e.printStackTrace();
    }

    makeConnections();
}

public synchronized boolean makeConnections() {
    try {
        switch (ConnectionManager.getDatabaseType()) {
        case SQLITE:
            if (conn == null || conn.isClosed()) {
                SQLiteConfig config = new SQLiteConfig();
                config.setJournalMode(JournalMode.WAL);
                conn = DriverManager.getConnection("jdbc:sqlite:data.sqlite", config.toProperties());
                conn.setAutoCommit(false);
            }
            break;
        case MARIADB:
            if (conn == null || conn.isClosed()) {
                conn = DriverManager.getConnection("jdbc:mariadb://data.mariadb");
                conn.setAutoCommit(false);
            }
            break;
        }

        return true;
    } catch (SQLException e) {
        e.printStackTrace();
        return false;
    }
}

错误信息:

Exception in thread "main" java.lang.IllegalArgumentException: Invalid connection URL url jdbc:sqlite:data.sqlite
at org.mariadb.jdbc.JDBCUrl.parse(JDBCUrl.java:144)
at org.mariadb.jdbc.Driver.connect(Driver.java:95)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at database.DBHelper.makeConnections(DBHelper.java:96)
at database.DBHelper.<init>(DBHelper.java:60)
at database.DBHelper.getSingleton(DBHelper.java:28)

我清楚地注册了名称为“org.sqlite.JDBC”的jdbc驱动程序。但我不知道为什么日志消息包含“at org.ma​​riadb.jdbc.Driver.connect(...)”。

MariaDB jdbc文件(*.jar)删除后,程序执行成功。

【问题讨论】:

  • 发布您的 DBHelper 的完整代码

标签: java eclipse sqlite jdbc mariadb


【解决方案1】:

这绝对是 mariadb 1.2.0 jdbc 驱动程序的问题,并且与所有其他 jdbc 驱动程序一起出现。见

https://mariadb.atlassian.net/plugins/servlet/mobile#issue/CONJ-167

【讨论】:

    【解决方案2】:

    删除此代码:

    driver = (Driver) Class.forName("org.sqlite.JDBC").newInstance();
    DriverManager.registerDriver(driver);
    

    并替换为

    Class.forName("org.sqlite.JDBC")
    

    这就是加载适当驱动程序所需要做的全部工作。原因是当驱动类被加载的类加载时,它会自动向 DriverManager 注册自己。您也应该对 MariaDB 驱动程序类执行此操作。

    【讨论】:

      【解决方案3】:

      我自己找到了解决方案。 JDBC 4.0 除了手动加载类外,还使用ServiceLoader 机制。因此,Class.ForName 不再用于显式加载 JDBC 驱动程序。所以我从我的代码中删除了以下几行:

      try {
          driver = (Driver) Class.forName("org.sqlite.JDBC").newInstance();
          DriverManager.registerDriver(driver);
      } catch (SQLException e) {
          e.printStackTrace();
      } catch (ClassNotFoundException e) {
          e.printStackTrace();
      } catch (IllegalAccessException e) {
          e.printStackTrace();
      } catch (InstantiationException e) {
          e.printStackTrace();
      }
      

      只需删除以上几行,程序就会自动找到合适的 JDBC 驱动程序并运行良好。

      【讨论】:

        猜你喜欢
        • 2019-03-24
        • 2014-12-04
        • 1970-01-01
        • 2012-07-31
        • 1970-01-01
        • 1970-01-01
        • 2012-08-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多