런타임에 인스턴스화된 드라이버를 사용하여 JDBC MySQL 드라이버를 로드하는 방법.

7726 단어
최근에는 런타임에 JDBC 드라이버를 로드해야 하는 Java 응용 프로그램을 개발하는 작업을 했습니다.

기본적으로 Java는 ClassLoader 클래스라고 하는 클래스 로딩 방식의 솔루션을 제공하고 있습니다.
그러나 타사 공급업체의 JDBC 드라이버는 사용하기에 매우 민감하고 까다롭습니다.
일반적인 자바 클래스 로딩 방식으로 접근하면 목표 달성에 실패할 수 있다. 특히 MySQL 드라이버가 작동하지 않고 "적합한 드라이버를 찾을 수 없음"메시지가 출력됩니다. 지금까지의 내 경험으로는 MySQL 드라이버가 그렇게 잘못 작동했을 뿐인데, 다른 드라이버가 그렇게 잘못 작동할 수도 있습니다.

그럼에도 불구하고 Java 클래스 로딩의 일반적인 사용법에 대해 설명하겠습니다. 일반적으로 런타임 시 JDBC 클래스 로딩 코드는 아래와 같습니다.

    public static Connection getConnection(File jarFile) throws MalformedURLException, ClassNotFoundException, InstantiationException, IllegalAccessException, SQLException {
        URL jarUrl = jarFile.toURI().toURL();
        URLClassLoader loader = new URLClassLoader(new URL[]{jarUrl}, ClassLoader.getSystemClassLoader());
        Class clazz = Class.forName("com.mysql.jdbc.Driver", true, loader);
        Properties prop = new Properties();
        prop.put("user", "admin");
        prop.put("password", "1234");
        Connection conn = (Connection)DriverManager.getConnection("jdbc:mysql://192.168.1.157:3306/mysql", prop);
        return conn;
    }


위 코드 조각은 아래에 있는 콘솔에 오류 메시지와 함께 실패합니다.

D:\Projects\chaos-commons> cmd /C "c:\Users\chaos\.vscode\extensions\vscjava.vscode-java-debug-0.31.0\scripts\launcher.bat C:\jdk-11\bin\java.exe -Dfile.encoding=UTF-8 @C:\Users\chaos\AppData\Local\Temp\cp_f58mz4nw79996julgmkyp9ycf.argfile org.chaostocosmos.commons.loader.JobClassLoader "
Exception in thread "main" java.sql.SQLException: No suitable driver found for jdbc:mysql://192.168.1.157:3306/mysql
        at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:702)
        at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:189)
        at org.chaostocosmos.commons.loader.JobClassLoader.getConnection(JobClassLoader.java:75)
        at org.chaostocosmos.commons.loader.JobClassLoader.main(JobClassLoader.java:92)


위의 코드에서는 jar 파일의 경로에서 URLClassLoader 클래스를 생성하고, URLClassLoader 객체로 Class.forName 메소드로 JDBC 드라이버를 로드한 후 DriverManager 객체로 Connection 객체를 얻었습니다.

이제 잘 작동하는 코드 샘플을 볼 것입니다. URLClassLoader의 loadClass 메소드로 Driver 객체를 생성한 후 Driver 객체의 connect 메소드로 Connection 객체를 가져와야 합니다.

완성된 코드는 아래에 있습니다.

    public static Connection getConnectionByDriver(File jarFile) throws MalformedURLException, InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException {
        URL jarUrl = jarFile.toURI().toURL();
        URLClassLoader loader = new URLClassLoader(new URL[]{jarUrl}, ClassLoader.getSystemClassLoader());
        Driver driver = (Driver) loader.loadClass("com.mysql.jdbc.Driver").newInstance();
        Properties prop = new Properties();
        prop.put("user", "admin");
        prop.put("password", "1234");
        Connection conn = driver.connect("jdbc:mysql://192.168.1.157:3306/mysql", prop);
        return conn;
    }


제 경험상 Oracle 드라이버는 일반적인 Java 클래스 로딩 방식에서 잘 작동했지만 MySQL은 그렇지 않았습니다. 다른 DB 드라이버는 아직 테스트하지 않았습니다.
다른 드라이버에 대해 뭔가를 발견했다면 모든 DEV에게 알려주세요 :) 감사합니다.

좋은 웹페이지 즐겨찾기