Один запрос 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" в наборе результатов, найти лучший план выполнения и т.д.)
Может быть, знаете ли вы каким-либо другим способом (используя бесплатные решения с открытым исходным кодом) или дайте мне какие-либо советы из вашего опыта о путях выше? Любая помощь будет принята с благодарностью.
Ответы
Ответ 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 к запросам конкретной базы данных.