Обработка нескольких драйверов JDBC от одного и того же продавца - PullRequest
5 голосов
/ 07 марта 2012

Вчера я столкнулся с большой проблемой.В моем текущем проекте я использую ojdbc6 реализацию Oracle JDBC для соединения, но также мне нужно будет обрабатывать, например, базы данных Oracle 8, что совершенно невозможно с этим JAR.Вы могли бы сказать, что я должен использовать ojdbc14, например, что было верно для некоторых тестов, но давайте предположим, что позже мне потребуется обработать 2 вида баз данных от одного и того же поставщика, но мы знаем, что для не существует существующей реализации.ОБА и мне нужно, чтобы эти одновременно были загружены.Тот же интерфейс (и, конечно, не просто тот же интерфейс, та же структура классов, просто другая реализация внутри!), Тот же префикс соединения URL -> Соединение JDBC будет использовать один драйвер, но я не могу загрузить несколько из них.И что теперь?

  • Моей первой идеей было загрузить JAR-файлы разными загрузчиками классов, может быть, я мог бы загрузить одну и ту же структуру пакета с одинаковыми классами, отделенными друг от друга?Я так не думаю, может быть, это была моя глупая идея.Это может также стать общей проблемой позже, не только с драйверами JDBC, поэтому, даже если вы не можете ответить на мой вопрос, но знаете, чего здесь не хватает, скажите мне

  • Даже если бы я мог сделатьотдельная загрузка реализаций классов с одинаковыми именами классов, как я могу сообщить DriverManager при создании соединения для использования драйвера EXACT вместо того, чтобы найти драйвер на основе префикса URL-адреса соединения?(где я имею в виду, например, jdbc: oracle: thin).

Теперь я чувствую себя совершенно тупым, потому что я думаю, что это не совсем необычная идея, с которой можно справиться в мире Java, НО я совершенно не знаю, как справиться.

Заранее спасибо

Ответы [ 2 ]

6 голосов
/ 07 марта 2012

На самом деле у вас есть несколько вариантов:

  1. Вы можете попробовать загрузить драйверы из загрузчиков разных классов.Это будет работать, если вам нужен только чистый JDBC в вашем приложении.Я сомневаюсь, что вы получите Hibernate для работы с такой настройкой.

    В конце концов вам придется запускать код, где вам нужно будет видеть экземпляры из обоих загрузчиков классов, и здесь вы получите ClassCastException s (дваклассы с одинаковым полным квалифицированным именем различаются, когда они были загружены из разных загрузчиков классов).

  2. Вы можете разделить свое приложение на два.Второй - это небольшой сервер, который принимает команды из вашего исходного приложения и переводит их в JDBC для базы данных.Небольшой сервер взаимодействует с Oracle 8, в то время как ваше приложение взаимодействует только с одной базой данных.

    Этот подход позволит вам полностью отделить две проблемы, но вы не сможете запускать объединения в двух базах данных.

  3. Вы можете связать старую базу данных Oracle 8 с вашей новой базой данных, используя CREATE DATABASE LINK .Это делает старые таблицы видимыми, как если бы они были частью новой базы данных.Ваше приложение общается только с одной БД, а Oracle обрабатывает детали внутри.

    Возможно, Oracle 8 слишком стар, чтобы это работало, но я обязательно попробую.

  4. Драйверы Oracle JDBC более совместимы, чем вы могли ожидать.Когда вы говорите «что совершенно невозможно с этим JAR», вы пробовали это?В прошлом я использовал драйвер Oracle 10 для подключения к Oracle 7.Не каждая функция поддерживалась, но я мог запускать стандартные запросы и обновления.

0 голосов
/ 01 августа 2016
#jdbc.properties
oracle.driver=oracle.jdbc.OracleDriver
oracle.url=jdbc:oracle:thin:@//localhost/xe
oracle.user=scott
oracle.password=tiger

mysql.driver=com.mysql.jdbc.Driver
mysql.url=jdbc:mysql://localhost/sales
mysql.user=root

mssql.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
mssql.url=jdbc:sqlserver://192.168.1.175;databaseName=sales
mssql.user=dbviewer
mssql.password=dbviewer

А затем прочитайте файл свойств:

class QueryTest2 {

   public static void main(String[] args) throws Exception{
        Properties settings = new Properties();
        FileInputStream fin = new FileInputStream("jdbc.properties");
        settings.load(fin);
        fin.close();
        String dvr = settings.getProperty(args[0] + ".driver");
        String url = settings.getProperty(args[0] + ".url");
        String usr = settings.getProperty(args[0] + ".user");
        String pwd = settings.getProperty(args[0] + ".password");
        Class.forName(dvr);
        Connection con = DriverManager.getConnection(url, usr, pwd);
        Statement stmt = con.createStatement();
        ResultSet rs = stmt.executeQuery("select pno,price,stock from products");
        while(rs.next()){
            System.out.printf("%d\t%.2f\t%d%n", rs.getInt(1), rs.getDouble(2), rs.getInt("stock"));
        }
        rs.close();
        stmt.close();
        con.close();
    }
}
...