在运行时加载JDBC驱动程序

时间:2011-04-15 09:11:07

标签: java jdbc jar classloader

我正在使用以下代码加载驱动程序类:

public class DriverLoader extends URLClassLoader {

    private DriverLoader(URL[] urls) {
        super(urls);
        File driverFolder = new File("driver");
        File[] files = driverFolder.listFiles();
        for (File file : files) {
            try {
                addURL(file.toURI().toURL());
            } catch (MalformedURLException e) {
            }
        }
    }


    private static DriverLoader driverLoader;


    public static void load(String driverClassName) throws ClassNotFoundException {
        try {
            Class.forName(driverClassName);
        } catch (ClassNotFoundException ex) {
            if (driverLoader == null) {
                URL urls[] = {};
                driverLoader = new DriverLoader(urls);
            }
            driverLoader.loadClass(driverClassName);
        }
    }
}

虽然类加载正常,但无论我尝试使用哪种驱动程序,都无法建立数据库连接(找不到合适的驱动程序...)。

我认为这是因为我没有使用Class.forName加载驱动程序类(由于我使用自己的ClassLoader,因此无效)。我该如何解决这个问题?

3 个答案:

答案 0 :(得分:7)

您需要先创建驱动程序类的实例,然后才能连接:

Class drvClass = driverLoader.loadClass(driverClassName);
Driver driver = drvClass.newInstance();

获得实例后,您可以使用该实例进行连接:

Properties props = new Properties();
props.put("user", "your_db_username");
props.put("password", "your_db_password");
Connection con = driver.connect("jdbc:postgresql:...", props);

作为替代方案,如果您想继续使用DriverManager,您必须手动向DriverManager注册驱动程序:

DriverManager.registerDriver(driver);

然后您应该能够使用DriverManager建立连接。

如果我没记错的话,如果驱动程序本身未被与DriverManager相同的类加载器加载,则DriverManager拒绝连接时出现问题。如果是(仍然),则需要直接使用Driver.connect()。

答案 1 :(得分:2)

您应该在DriverLoader加载的类中建立连接。因此,使用DriverLoader加载连接建立代码,然后从中调用JDBC。

答案 2 :(得分:0)

您需要在清单中添加Classpath引用。请按照以下简单步骤操作:

将“lib”文件夹添加到您的应用程序

在lib

中放置“mysql-connector-java-5.1.18-bin”

现在打开你的“MANIFEST.MF”并转到标签“RUNTIME”

在右下方的

,你会看到“classpath”;点击“添加”

现在添加文件夹lib [在步骤1中创建]以及jar文件

通过这种方式,每当启动运行时EclipseApplication / OSGi应用程序时,此jar文件也会被导出。因此,那里的连接也将可用。