Подтвердить что ты не робот

Один запрос SQL для доступа к нескольким источникам данных в Java (от oracle, excel, sql server)

Мне нужно разработать приложение, которое может получать данные из нескольких источников данных (Oracle, Excel, Microsoft Sql Server и т.д.), используя один SQL query. Например:

 SELECT o.employeeId, count(o.orderId) 
    FROM [email protected] e. [email protected] c, [email protected] o 
    WHERE o.employeeId = e.employeeId and o.customerId = c.customerId 
    GROUP BY o.employeeId;

Этот sql и источники данных должны динамически меняться с помощью java-программы. Мои клиенты хотят писать и запускать sql-like query из разных баз данных и хранилища в одно и то же время с помощью group by, having, count, sum и т.д. в веб-интерфейсе моего приложения. Другие требования - это производительность и легкий вес.

Я нахожу этот способ сделать это (и какие недостатки я вижу, пожалуйста, исправьте меня, если я ошибаюсь):

  • Apache Spark ( недостатки: тяжелое решение, лучше для BigData, медленно, если вам нужно получать самую свежую информацию без кэширования в Spark),

  • Распределенные запросы в SQL Server (Ссылка на базу данных Oracle, Связанные сервер Microsoft SQL Server, Power Query of Excel) - недостатки: проблема динамического изменения источников данных с помощью java-программы и проблема с работой с Excel,

  • Prestodb ( недостатки: тяжелое решение, лучше для BigData),

  • Apache Drill ( недостатки: довольно молодое решение, некоторая проблема с не последние драйверы odbc и некоторые ошибки при работе),

  • Apache Calcite (ligth framework, который будет использоваться сверлом Apache, недостатки: довольно молодое решение еще),

  • Соединяйтесь с источниками данных вручную ( недостатки: много работы для разработать правильное соединение, "group by" в наборе результатов, найти лучший план выполнения и т.д.)

Может быть, знаете ли вы каким-либо другим способом (используя бесплатные решения с открытым исходным кодом) или дайте мне какие-либо советы из вашего опыта о путях выше? Любая помощь будет принята с благодарностью.

4b9b3361

Ответ 1

Одним из подходящих решений является DataNucleus платформа с API-интерфейсами JDO, JPA и REST. Он поддерживает почти все СУБД (PostgreSQL, MySQL, SQLServer, Oracle, DB2 и т.д.) И хранилища данных NoSQL, такие как Map based, Graph based, Doc based и т.д., Веб-службы базы данных, LDAP, такие документы, как XLS, ODF, XML и т.д.

В качестве альтернативы вы можете использовать EclipseLink, который также поддерживает RDBMS, NoSQL, веб-службы базы данных и XML.

Используя JDOQL, который является частью JDO API, будет выполнено требование о наличии одного запроса для доступа к нескольким хранилищам данных. Оба решения являются open-source, относительно легкими и эффективными.

Почему я предложил это решение?

  • Из вашего требования оно понимает, что хранилище данных будет вашим выбором клиента, и вы не ищете решение для больших данных.
  • Вы предпочитаете решения с открытым исходным кодом, которые легки и эффективны.
  • Учитывая ваш прецедент, вам может потребоваться платформа управления данными с многопользовательским поведением, которая может использовать несколько хранилищ данных на основе ваших/клиентских случаев использования.

Чтобы узнать больше о сохранности полиглота

https://dzone.com/articles/polyglot-persistence-future

https://www.mapr.com/products/polyglot-persistence

Ответ 2

UnityJDBC - это коммерческий драйвер JDBC, который обертывает несколько datasoruces и позволяет вам обрабатывать их так, как если бы они были частью одной базы данных. Он работает следующим образом:

Вы определяете "файл схемы" для описания каждой из ваших баз данных. Файл схемы похож на:

...
<TABLE>
    <semanticTableName>Database1.MY_TABLE</semanticTableName>
    <tableName>MY_TABLE</tableName>
    <numTuples>2000</numTuples>
 <FIELD>
    <semanticFieldName>MY_TABLE.MY_ID</semanticFieldName>
    <fieldName>MY_ID</fieldName>
    <dataType>3</dataType>
    <dataTypeName>DECIMAL</dataTypeName>
    ...

У вас также есть центральный "исходный файл", который ссылается на все ваши файлы схемы и предоставляет информацию о соединении, и выглядит так:

<SOURCES>
    <DATABASE>
        <URL>jdbc:oracle:thin:@localhost:1521:xe</URL>
        <USER>scott</USER>
        <PASSWORD>tiger</PASSWORD>
        <DRIVER>oracle.jdbc.driver.OracleDriver</DRIVER>
        <SCHEMA>MyOracleSchema.xml</SCHEMA>
    </DATABASE>
    <DATABASE>
        <URL>jdbc:sqlserver://localhost:1433</URL>
        <USER>sa</USER>
        <PASSWORD>Password123</PASSWORD>
        <DRIVER>com.microsoft.sqlserver.jdbc.SQLServerDriver</DRIVER>
        <SCHEMA>MySQLServerSchema.xml</SCHEMA>
    </DATABASE> 
</SOURCES>

Затем вы можете использовать unity.jdbc.UnityDriver, чтобы ваш Java-код мог запускать SQL, который объединяется между базами данных, например:

String sql = "SELECT *\n" +
"FROM MyOracleDB.Whatever, MySQLServerDB.Something\n" +
"WHERE MyOracleDB.Whatever.whatever_id = MySQLServerDB.Something.whatever_id";
stmt.execute(sql);

Итак, похоже, что UnityJDBC предоставляет необходимую вам функциональность, однако я должен сказать, что любое решение, которое позволяет пользователям выполнять произвольный SQL, который объединяет таблицы в разных базах данных, звучит как рецепт, чтобы привести базы данных на колени. Решение, которое я бы рекомендовал для вашего типа требований, - это сделать ETL из всех источников данных в один хранилище данных и разрешить пользователям запрашивать это; как определить эти процессы и ваш хранилище данных, безусловно, слишком широк для вопроса о stackoverflow.

Ответ 3

SQL связан с системой управления базами данных. SQL Server потребует других операторов SQL, чем сервер Oracle SQL.

Мое предложение - использовать JPA. Он полностью независим от вашей системы управления базами данных и значительно повышает эффективность разработки на Java.

Недостатком является то, что нельзя комбинировать несколько систем баз данных с JPA из коробки (например, в соотношении 1:1 между SQL Server и сервером Oracle SQL). Однако вы можете создать несколько EntityManagerFactories (по одному для каждой базы данных) и связать их вместе в своем коде.

Плюсы JPA в этом сценарии:

  • написать систему управления базами данных независимыми запросами JPQL
  • уменьшает требуемый код Java

Минусы для JPA:

  • вы не можете связывать объекты из разных баз данных (например, в соотношении 1:1).
  • вы не можете запрашивать несколько баз данных с одним запросом (объединение таблиц из разных баз данных в group by или подобное)

Дополнительная информация:

Ответ 4

Я бы порекомендовал presto и calcite. производительность и легкий не всегда идут рука об руку.

  • presto: довольно много доказанных применений, как вы сказали "большие данные". хорошо выполняет весы. Я не совсем понимаю, что означает легкий вес, если требуется меньшее количество машин, это один из них, вы можете определенно масштабировать меньше в соответствии с вашими потребностями.

  • calcite: встроен во множество аналитических библиотек данных, таких как drill kylin phoenix. делает то, что вам нужно "подключение к нескольким БД" и, самое главное, "легкий вес"

Ответ 5

Опыт работы с некоторыми из кандидатов (Apache Spark, Prestodb, Apache Drill) заставляет меня выбрать Prestodb. Несмотря на то, что он используется в больших данных, я думаю, что его легко настроить, и он поддерживает почти все, о чем вы просите. Существует множество ресурсов, доступных в Интернете (включая запуск в Docker), а также отличный и активное сообщество, а также поддержку от двух компаний (Facebook и Netflix).

Ответ 6

Несколько баз данных на нескольких серверах от разных поставщиков Самый сложный случай - когда базы данных находятся на разных серверах, а на некоторых серверах работает различное программное обеспечение базы данных. Например, база данных клиентов может размещаться на компьютере X в Oracle, а база данных заказов может размещаться на компьютере Y с Microsoft SQL Server. Даже если обе базы данных размещены на компьютере X, но один находится на Oracle, а другой на Microsoft SQL Server, проблема одна и та же: каким-то образом информация в этих базах данных должна делиться на разных платформах. Многие коммерческие базы данных поддерживают эту функцию, используя некоторую форму федерации, интеграционные компоненты или связывание таблиц (например, IBM, Oracle, Microsoft), но поддержка в базах данных с открытым исходным кодом (HSQL, MySQL, PostgreSQL) ограничена.

Существуют различные методы решения этой проблемы:

  • Table Linking and Federation - ссылки на таблицы из одного источника в другой для запроса
  • Custom Code - написать код и несколько запросов для объединения вручную данные
  • Data Warehousing/ETL - извлечение, преобразование и загрузка данных в другой источник
  • Mediation Software - напишите один запрос, который медиатор для извлечения необходимых данных

Ответ 7

Может быть идея заработной платы. Попробуйте использовать Apache solr. Пользователь разных источников данных и импортировать данные в Apache solr. Когда данные доступны, вы можете писать разные запросы, индексируя его.

Это поисковая платформа с открытым исходным кодом, которая гарантирует, что ваш поиск будет быстрее.

Ответ 8

Для чего нужна инфраструктура Hibernate, у Hibernate есть собственный язык запросов HQL, в основном идентичный SQL. Спящий режим выступает в качестве промежуточного продукта для преобразования запроса HQL к запросам конкретной базы данных.