런타임에 인스턴스화된 드라이버를 사용하여 JDBC MySQL 드라이버를 로드하는 방법.
기본적으로 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에게 알려주세요 :) 감사합니다.
Reference
이 문제에 관하여(런타임에 인스턴스화된 드라이버를 사용하여 JDBC MySQL 드라이버를 로드하는 방법.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/kooin/how-to-load-jdbc-mysql-driver-using-instantiated-driver-on-runtime-43m1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)