gpt4 book ai didi

java - 如何从任意位置使用 JDBC 驱动程序

转载 作者:太空狗 更新时间:2023-10-29 22:39:45 25 4
gpt4 key购买 nike

我需要测试与数据库的 JDBC 连接。执行此操作的 Java 代码应简单如下:

DriverManager.getConnection("jdbc connection URL", "username", "password");

驱动程序管理器将为给定的连接 URL 查找合适的驱动程序。但是我需要能够在运行时加载 JDBC 驱动程序 (jar)。也就是说,我在运行上述代码片段的 Java 应用程序的类路径上没有 JDBC 驱动程序。

所以我可以使用这段代码加载驱动程序,例如:

URLClassLoader classLoader = new URLClassLoader(new URL[]{"jar URL"}, this.getClass().getClassLoader());
Driver driver = (Driver) Class.forName("jdbc driver class name", true, classLoader).newInstance();

但是驱动程序管理器仍然不会选择它,因为我无法告诉它使用哪个类加载器。我尝试设置当前线程的上下文类加载器,但它仍然不起作用。

有人知道实现该目标的最佳方法吗?

最佳答案

来自文章Pick your JDBC driver at runtime ;我只是将代码发布在这里以供引用。

这个想法是让驱动程序管理器认为驱动程序是从系统类加载器加载的。为此,我们使用此类:

public class DelegatingDriver implements Driver
{
private final Driver driver;

public DelegatingDriver(Driver driver)
{
if (driver == null)
{
throw new IllegalArgumentException("Driver must not be null.");
}
this.driver = driver;
}

public Connection connect(String url, Properties info) throws SQLException
{
return driver.connect(url, info);
}

public boolean acceptsURL(String url) throws SQLException
{
return driver.acceptsURL(url);
}

public DriverPropertyInfo[] getPropertyInfo(String url, Properties info) throws SQLException
{
return driver.getPropertyInfo(url, info);
}

public int getMajorVersion()
{
return driver.getMajorVersion();
}

public int getMinorVersion()
{
return driver.getMinorVersion();
}

public boolean jdbcCompliant()
{
return driver.jdbcCompliant();
}
}

通过这种方式,您注册的驱动程序属于 DelegatingDriver 类型,它由系统类加载器加载。您现在只需使用您想要的任何类加载器加载您真正想要使用的驱动程序。例如:

URLClassLoader classLoader = new URLClassLoader(new URL[]{"path to my jdbc driver jar"}, this.getClass().getClassLoader());
Driver driver = (Driver) Class.forName("org.postgresql.Driver", true, classLoader).newInstance();
DriverManager.registerDriver(new DelegatingDriver(driver)); // register using the Delegating Driver

DriverManager.getDriver("jdbc:postgresql://host/db"); // checks that the driver is found

关于java - 如何从任意位置使用 JDBC 驱动程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/288828/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com