web-dev-qa-db-ja.com

Java(Oracle、Excel、SQLサーバーから)の複数のデータソースにアクセスするための1つのSQLクエリ

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などを使用します。その他の要件は、パフォーマンスと軽量です。

私はそれを行うためにこの方法を見つけます(そして私が見るどんな欠点も、私が間違っているなら私を直してください):

  1. Apache Spark欠点:重い解決策、BigDataの方が優れており、Sparkにキャッシュせずに最新の情報を取得する必要がある場合は遅くなります)、

  2. SQLサーバーでの分散クエリOracleのデータベースリンクMicrosoft SQL ServerのリンクサーバーExcelのパワークエリ )-欠点:Java)による動的なデータソースの変更に関する問題プログラムとExcelの操作に関する問題、

  3. Prestodb欠点:重い解決策、ビッグデータにとってより良い)、

  4. Apache Drill欠点:かなり若い解決策、最新ではないodbcドライバーに関するいくつかの問題、および作業中のいくつかのバグ)、

  5. Apache Calcite(Apache Drillで使用されるligthフレームワーク、欠点:まだかなり若い解決策)、

  6. データソースから手動で結合する(欠点:正しい結合を開発するための多くの作業、結果セットでの「グループ化」、最適な実行プランの検索などオン)

他の方法(無料のオープンソースソリューションを使用)を知っているか、上記の方法についての経験からアドバイスをください。どんな助けでも大歓迎です。

16

適切なソリューションの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つのクエリを持つという要件が満たされます。どちらのソリューションもオープンソースであり、比較的軽量でパフォーマンスが高いです。

なぜこの解決策を提案したのですか?

  • あなたの要件から、データストアがあなたの顧客の選択であり、あなたはビッグデータソリューションを探していないことが理解されました。
  • 軽量でパフォーマンスの高いオープンソースソリューションを好んでいます。
  • ユースケースを考慮すると、ポリグロット永続性を備えたデータ管理プラットフォームが必要になる場合がありますあなた/顧客のユースケースに基づいて、複数のデータストアを活用する能力を持つ行動。

多言語の永続性について詳しく読むには

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

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

4
Hari

nityJDBCcommercialJDBCドライバーであり、複数のデータソースをラップし、それらがすべて同じものの一部であるかのように扱うことができます。データベース。これは次のように機能します。

スキーマファイル」を定義して、各データベースを記述します。スキーマファイルは次のようなものです。

...
<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 [〜#〜] すべてのデータソースから単一の データウェアハウスそしてユーザーがそれをクエリできるようにします。これらのプロセスとデータウェアハウスを定義する方法は、スタックオーバーフローの質問には明らかに広すぎます。

7
heenenee

SQLはデータベース管理システムに関連しています。 SQL Serverには、OracleSQLサーバー以外のSQLステートメントが必要です。

私の提案は、[〜#〜] jpa [〜#〜]を使用することです。データベース管理システムから完全に独立しており、Javaでの開発がはるかに効率的になります。

欠点は、複数のデータベースシステムをJPAとすぐに組み合わせることができないことです(SQLServerとOracleSQL Serverの間の1:1の関係のように)。ただし、複数のEntityManagerFactories(データベースごとに1つ)を作成して、コード内でそれらをリンクすることはできます。

このシナリオでのJPAの長所:

  • データベース管理システムに依存しないJPQLクエリを作成する
  • 必要なJavaコードを減らす

JPAの短所:

  • 異なるデータベースのエンティティを関連付けることはできません(1:1の関係のように)
  • 1つのクエリで複数のデータベースにクエリを実行することはできません(異なるデータベースのテーブルをgroup by または類似)

詳しくは:

4
slartidan

prestocalciteをお勧めします。 パフォーマンス軽量は必ずしも密接に関連しているわけではありません。

  • presto:あなたが「ビッグデータ」と言ったように、かなり多くの実証済みの使用法。うまくスケールします。 軽量が何を意味するのかよくわかりません。具体的には、必要なマシンの数が少ない場合は、必要に応じてスケーリングを減らすことができます。

  • calcitedrillkylinphoenixのような多くのデータ分析ライブラリに埋め込まれています。 「複数のDBへの接続」、そして最も重要な「軽量」で必要なことを実行します

3
zinking

異なるベンダーの複数のサーバー上の複数のデータベース最も困難なケースは、データベースが異なるサーバー上にあり、一部のサーバーが異なるデータベースソフトウェアを実行している場合です。たとえば、顧客データベースは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つのクエリを記述します
2
Santosh

いくつかの候補(Apache Spark、Prestodb、Apache Drill)の経験があるので、Prestodbを選びました。ほとんどの場合ビッグデータで使用されますが、セットアップは簡単で、(ほぼ)あなたが求めているすべてのものをサポートしていると思います。オンラインで利用できるリソースはたくさんあり( Docker での実行を含む)、優れた documentation とアクティブなコミュニティがあり、2つの会社(FacebookとNetflix)からのサポートもあります。

2
Istvan

賃金のアイデアかもしれません。 Apachesolrを使用してみてください。さまざまなデータソースを使用して、データをApachesolrにインポートします。データが利用可能になったら、インデックスを作成してさまざまなクエリを作成できます。

これはオープンソースの検索プラットフォームであり、検索がより高速になります。

1
BValluri

そのため、Hibernateフレームワークは、Hibernateには独自のクエリ言語があります[〜#〜] hql [〜#〜]ほとんどSQLと同じです。 Hibernateは、[〜#〜] hql [〜#〜]クエリをデータベース固有のクエリに変換するミドルウェアとして機能します。

1
Raju Rao