Загрузка драйвера JDBC во время выполнения - PullRequest
5 голосов
/ 15 апреля 2011

Я использую следующий код для загрузки класса драйвера:

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 ]

7 голосов
/ 15 апреля 2011

Вам необходимо создать экземпляр класса драйвера, прежде чем вы сможете подключиться:

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 () напрямую.

2 голосов
/ 15 апреля 2011

Вы должны установить соединение в классе, загруженном вашим DriverLoader. Итак, загрузите код установления соединения, используя DriverLoader, а затем вызовите из него JDBC.

0 голосов
/ 05 декабря 2011

Вам необходимо добавить ссылку на Classpath в манифест.Выполните следующие простые шаги:

добавьте папку "lib" в ваше приложение

поместите "mysql-connector-java-5.1.18-bin" в lib

, теперь откройтеваш "MANIFEST.MF" и перейдите на вкладку "RUNTIME"

в правом нижнем углу, вы увидите "classpath";нажмите «Добавить»

, теперь добавьте папку lib [созданную в шаге 1] вместе с файлом jar

таким образом, при каждом запуске EclipseApplication / OSGi Application во время выполнения этот файл jar экспортируетсявместе сТаким образом, подключение также будет доступно там.

...