1つのOracle, Excel, Microsoft Sql Server
を使用して、複数のデータソース(SQL query
など)からデータを取得できるアプリケーションを開発する必要があります。例えば:
SELECT o.employeeId, count(o.orderId)
FROM employees@Excel e. customers@microsoftsql c, orders@Oracle o
WHERE o.employeeId = e.employeeId and o.customerId = c.customerId
GROUP BY o.employeeId;
このSQLソースとデータソースは、Javaプログラムによって動的に変更する必要があります。私の顧客は、同じデータベースとストレージからsql-like query
を作成して実行したいと考えています。私のアプリケーションのWebインターフェイスでgroup by, having, count, sum
などを使用します。その他の要件は、パフォーマンスと軽量です。
私はそれを行うためにこの方法を見つけます(そして私が見るどんな欠点も、私が間違っているなら私を直してください):
Apache Spark(欠点:重い解決策、BigDataの方が優れており、Sparkにキャッシュせずに最新の情報を取得する必要がある場合は遅くなります)、
SQLサーバーでの分散クエリ( Oracleのデータベースリンク 、 Microsoft SQL Serverのリンクサーバー 、 Excelのパワークエリ )-欠点:Java)による動的なデータソースの変更に関する問題プログラムとExcelの操作に関する問題、
Prestodb(欠点:重い解決策、ビッグデータにとってより良い)、
Apache Drill(欠点:かなり若い解決策、最新ではないodbcドライバーに関するいくつかの問題、および作業中のいくつかのバグ)、
Apache Calcite(Apache Drillで使用されるligthフレームワーク、欠点:まだかなり若い解決策)、
データソースから手動で結合する(欠点:正しい結合を開発するための多くの作業、結果セットでの「グループ化」、最適な実行プランの検索などオン)
他の方法(無料のオープンソースソリューションを使用)を知っているか、上記の方法についての経験からアドバイスをください。どんな助けでも大歓迎です。
適切なソリューションの1つは DataNucleus プラットフォームであり、JDO、JPA、およびREST APIがあります。ほぼすべてのRDBMS(PostgreSQL、MySQL、SQLServer、Oracle、DB2)をサポートしています。など)およびマップベース、グラフベース、ドキュメントベースなどのNoSQLデータストア、データベースWebサービス、LDAP、XLS、ODF、XMLなどのドキュメント。
または、 EclipseLink を使用することもできます。これは、RDBMS、NoSQL、データベースWebサービス、およびXMLもサポートしています。
JDO APIの一部であるJDOQLを使用することにより、複数のデータストアにアクセスするために1つのクエリを持つという要件が満たされます。どちらのソリューションもオープンソースであり、比較的軽量でパフォーマンスが高いです。
なぜこの解決策を提案したのですか?
多言語の永続性について詳しく読むには
nityJDBC はcommercialJDBCドライバーであり、複数のデータソースをラップし、それらがすべて同じものの一部であるかのように扱うことができます。データベース。これは次のように機能します。
「スキーマファイル」を定義して、各データベースを記述します。スキーマファイルは次のようなものです。
...
<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を実行できるようにするソリューションはレシピのように聞こえますデータベースをひざまずかせます。私が実際にあなたのタイプの要件に推奨する解決策は、do [〜#〜] etl [〜#〜] すべてのデータソースから単一の データウェアハウスそしてユーザーがそれをクエリできるようにします。これらのプロセスとデータウェアハウスを定義する方法は、スタックオーバーフローの質問には明らかに広すぎます。
SQLはデータベース管理システムに関連しています。 SQL Serverには、OracleSQLサーバー以外のSQLステートメントが必要です。
私の提案は、[〜#〜] jpa [〜#〜]を使用することです。データベース管理システムから完全に独立しており、Javaでの開発がはるかに効率的になります。
欠点は、複数のデータベースシステムをJPAとすぐに組み合わせることができないことです(SQLServerとOracleSQL Serverの間の1:1の関係のように)。ただし、複数のEntityManagerFactories
(データベースごとに1つ)を作成して、コード内でそれらをリンクすることはできます。
このシナリオでのJPAの長所:
JPAの短所:
group by
または類似)詳しくは:
presto
とcalcite
をお勧めします。 パフォーマンスと軽量は必ずしも密接に関連しているわけではありません。
presto
:あなたが「ビッグデータ」と言ったように、かなり多くの実証済みの使用法。うまくスケールします。 軽量が何を意味するのかよくわかりません。具体的には、必要なマシンの数が少ない場合は、必要に応じてスケーリングを減らすことができます。
calcite
:drill
kylin
phoenix
のような多くのデータ分析ライブラリに埋め込まれています。 「複数のDBへの接続」、そして最も重要な「軽量」で必要なことを実行します
異なるベンダーの複数のサーバー上の複数のデータベース最も困難なケースは、データベースが異なるサーバー上にあり、一部のサーバーが異なるデータベースソフトウェアを実行している場合です。たとえば、顧客データベースはOracleのマシンXでホストされ、注文データベースはMicrosoft SQLServerを使用してマシンYでホストされる場合があります。両方のデータベースがマシンXでホストされていても、一方がOracleで、もう一方がMicrosoft SQL Serverである場合でも、問題は同じです。どういうわけか、これらのデータベースの情報を異なるプラットフォーム間で共有する必要があります。多くの商用データベースは、何らかの形式のフェデレーション、統合コンポーネント、またはテーブルリンク(IBM、Oracle、Microsoftなど)を使用してこの機能をサポートしていますが、オープンソースデータベース(HSQL、MySQL、PostgreSQL)でのサポートは制限されています。
この問題を処理するにはさまざまな手法があります:
Table Linking and Federation
-クエリのためにテーブルをあるソースから別のソースにリンクするCustom Code
-データを手動で結合するためのコードと複数のクエリを記述しますData Warehousing/ETL
-データを抽出、変換、および別のソースにロードしますMediation Software
-必要なデータを抽出するためにメディエーターによって翻訳される1つのクエリを記述しますいくつかの候補(Apache Spark、Prestodb、Apache Drill)の経験があるので、Prestodbを選びました。ほとんどの場合ビッグデータで使用されますが、セットアップは簡単で、(ほぼ)あなたが求めているすべてのものをサポートしていると思います。オンラインで利用できるリソースはたくさんあり( Docker での実行を含む)、優れた documentation とアクティブなコミュニティがあり、2つの会社(FacebookとNetflix)からのサポートもあります。
賃金のアイデアかもしれません。 Apachesolrを使用してみてください。さまざまなデータソースを使用して、データをApachesolrにインポートします。データが利用可能になったら、インデックスを作成してさまざまなクエリを作成できます。
これはオープンソースの検索プラットフォームであり、検索がより高速になります。
そのため、Hibernateフレームワークは、Hibernateには独自のクエリ言語があります[〜#〜] hql [〜#〜]ほとんどSQLと同じです。 Hibernateは、[〜#〜] hql [〜#〜]クエリをデータベース固有のクエリに変換するミドルウェアとして機能します。