如何解决为什么运行时加载 MySQL 驱动程序输出“找不到合适的驱动程序”?
我尝试在我的应用程序运行时加载 MySQL 驱动程序。因此,我将 jar 文件加载方法设为“loadJobJars”,以便使用给定的 jar 文件列表创建 URLClassLoader 对象。我先调用 Class.forName 方法,然后调用 DriverManager.getConnection 方法。但是终端输出“找不到合适的驱动程序”。
有人知道为什么会这样吗?
我的代码如下。
public DBConnectionManager(Path jarPath) throws MalformedURLException {
this.urlClassLoader = loadJobJars(listJarFiles(jarPath));
}
public Connection createConnection(String dbName,String host,int port,String db,String user,String password) throws NoSuchFieldException,SecurityException,IllegalArgumentException,IllegalAccessException,ClassNotFoundException,SQLException,InstantiationException {
dbName = dbName.toLowerCase();
String url = "jdbc:" + dbName + "://" + host + ":" + port + "/" + db;
String driverName = DBDriver.getDriverName(dbName.toUpperCase());
Logger.getInstance().info("connection url: "+url+" driver: "+driverName);
Class.forName(driverName,true,this.urlClassLoader);
Connection conn = DriverManager.getConnection(url,user,password); //Here is it was happened code line.
return conn;
}
public URLClassLoader loadJobJars(File[] jarFiles) throws MalformedURLException {
URL[] urls = Arrays.asList(jarFiles).stream().map(f -> {
try {
System.out.println(f.getAbsolutePath());
return f.toURI().toURL();
} catch (MalformedURLException e) {
e.printStackTrace();
}
return null;
}).filter(u -> u != null).toArray(URL[]::new);
return URLClassLoader.newInstance(urls,ClassLoader.getPlatformClassLoader());
}
public File[] listJarFiles(Path jarPath) {
return jarPath.toFile().listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir,String name) {
return name.endsWith(".jar");
}
});
}
控制台输出如下。
[INFO][DBConnectionManager:77][20210119152004] connection url: jdbc:mysql://localhost:3306/mysql driver: com.mysql.jdbc.Driver
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:251)
at com.innotree.innoquartz.iqjobgen.DBConnectionManager.createConnection(DBConnectionManager.java:35)
at com.innotree.innoquartz.iqjobgen.DBConnectionManager.main(DBConnectionManager.java:77)
解决方法
DriverManager
创建连接的方式对调用代码的类加载器很敏感。用于创建连接的 Driver
必须对调用类的类加载器可见(或者当调用代码没有类加载器时,上下文类加载器)。您加载的驱动程序对调用代码的类加载器不可见,因此 DriverManager
不会使用该驱动程序创建连接。
您必须使用使用相同类加载器的代码(或至少在具有驱动程序的类加载器可见的地方)创建连接。或者,您需要直接使用 java.sql.Driver
,完全跳过 DriverManager
。
感谢您的友好回答。
我看到了你的回答,最后通过直接加载 MySQL 驱动程序找出问题所在。你的帮助对解决这个问题非常有用。解决方案代码如下。
String url = "jdbc:mysql://localhost:3306/mysql";
URLClassLoader loader = new URLClassLoader(urls,ClassLoader.getSystemClassLoader());
Class cls = loader.loadClass("com.mysql.jdbc.Driver");
Driver driver = (Driver)cls.newInstance();
Properties info = new Properties();
info.put("user","admin");
info.put("password","1234");
Connection conn = driver.connect(url,info);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。