programing

Eclipse 프로젝트의 여러 JDBC 파일

stoneblock 2023. 8. 27. 08:51

Eclipse 프로젝트의 여러 JDBC 파일

제 프로젝트에서는 SQLiteDB와 MariaDB를 모두 사용해야 합니다.

그래서 이클립스 프로젝트에서 jdbc 드라이버 파일(*.jar)을 가져왔습니다.

enter image description here

하지만 다음과 같은 오류가 발생했습니다.

코드:

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)

저는 jdbc 드라이버를 "org.sqlite"라는 이름으로 분명히 등록했습니다.JDBC." 그런데 왜 로그 메시지에 "at org.mariadb.jdbc"가 포함되어 있는지 모르겠습니다.드라이버.connect(...)

MariaDB jdbc 파일(*.jar)이 제거되면 프로그램이 성공적으로 실행됩니다.

이것은 mariadb 1.2.0 jdbc 드라이버의 문제이며 다른 모든 jdbc 드라이버와 함께 발생합니다. 참조

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

이 코드 제거:

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

로 대체합니다.

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

여기까지 하면 해당 드라이버를 로드할 수 있습니다.그 이유는 드라이버 클래스가 로드된 클래스에 의해 로드되면 드라이버 관리자에 자동으로 등록되기 때문입니다.MariaDB 드라이버 클래스에 대해서도 이 작업을 수행해야 합니다.

저는 혼자서 해결책을 찾았습니다.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 드라이버를 찾아 작동이 잘 되었습니다.

언급URL : https://stackoverflow.com/questions/31508959/multiple-jdbc-files-on-eclipse-project