2016-04-12 5 views
1

現在、PostgreSQLデータベースに接続するWebアプリケーションを開発中です。自分の言語としてJavaを使用しています.Mavenをビルドマネージャ(Webアプリケーションテンプレート)として使用しています。CSVデータを使用するWebアプリケーション用のJDBC付きPostgreSQLまたはHibernate

私のデータは多くのパイプ区切りファイルに含まれており、各行はテーブル内のエンティティ(各テーブルごとに1つのファイル)です。 20〜30個のテーブルがあり、それらの間の行の合計数は10億に達する。

私はpsqlにcsvインポータがあることを認識していますが、他のケースでもそれを使用しています。しかし、私は自分のアプリケーションで進歩するために最適なソフトウェアを決定しています。

私は、JDBCとHibernateの違い、利点、欠点などを知っており、それらを比較するさまざまな答えを読んでいます。私はHibernateが学習価値があると判断し、アプリケーションを最適にすると決めました。しかし、ここにはCSV輸入の問題があります。私はHibernateがこれをボックス外で実行しないことを知っています。そして、JDBCがより良い選択になるでしょう。

質問ですが、このシナリオではJDBCが明白な選択ですか?私はそれがHibernateとその逆の方が優先されるときに読んだが、私はいくつかの重複を持っていると確信することができないようだ。

私はCSVデータを読み込むためにSTDINのCopyManagerとCOPYを使用できるので、JDBCに行くのが最も理にかかりますか?私はJDBCよりも強固な利点があると思われ、新しい開発者として知るには良い技術だと思うので、私はHibernateにダイビングしたいと思っていましたが、私はこれを初めて使っていて、アドバイスが大好きです!

****明確化のために編集*****

だから私は、その後、時間をかけて、私はおそらく(CSVからもそうな)複数のテーブルを追加され、データベースにCSVデータのすべてをロードします私が決めるようにデータベースに。私のWebアプリケーションは基本的に、クライアントが作成したデータベース上で実行されるWebページ上の入力フォームにSQLクエリを入力し、必要なものを返すことを許可します。私は私のサーバーとしてtomcatを使用しています。

ありがとうございました!

+3

Hibernateは大量の挿入のようなバッチのような操作に適していません。すべてのアプリケーションでCSVファイルをインポートする必要がある場合は、JDBCが最善の選択であるかどうかはわかりません。単純なスクリプトではないのはなぜですか?Hibernateは典型的なCRUD操作に最適です。相互接続されたエンティティのグラフをナビゲートする必要がある複雑なユースケースを含む可能性があります。 –

+1

さらに、@ JBNizetが言ったように、あなたの "Webアプリケーション"は実際に何をしようとしていますか?それらのテキストファイルを定期的にインポートする必要がありますか?どうして?何のために?明確にするためにあなたの質問を編集してください。 –

+0

申し訳ありませんが、説明のため編集されました! –

答えて

1

実質的にはthisのdupですが、そのようにマークすることはありません。

基本的に、ストレートSQL/JDBCによる大量のデータロードは、既存のデータ制約が無効になっていない限り、非常に高価で、長時間実行されます。

ほとんどのETL(データ・ウェアハウス用の抽出 - 翻訳ロード)ツールは、SQLを回避してシートの下で作業をすばやく行うため、SQLをバイパスして問合せ解析(高価ですが、バインド・パラメータは軽減します)それらを無効にしたり、最後にすべてを一度に実行できる機能を使用したりすることができます(データを悪い状態にする可能性があるため)。一部のデータベースベンダー(MSSQLとOracleの場合)には、そのような大量の状況に役立つ基本的な負荷を行うツールがあります。

IMHO大量のバッチでJDBCを使用しないようにするには、可能な限りすべてを行う必要があります。エンタープライズレベルのツールにアクセスできない場合は、テクニックを使用して、pg_restoreが使用できる形式にファイルを操作します。一度データが再フォーマットされる必要がある場合でも、ほとんどの場合、一時表にデータをロードしてから、他のデータ操作/正規化が必要になることは簡単です。

+0

あなたの答えをありがとう。いくつかの思考と検索の後で、うまくいけばよいワークフローを作成しましたが、提案したようにpg_restoreは使用しません。テーブルが存在するかどうかをチェックするSQLスクリプトを作成し、作成しない場合は作成し、COPYを使用して新しく作成したテーブルにcsvデータをロードします。 Runtime.exec()を使ってJavaプログラムからこれを実行します。 (私はこれがJDBCよりも速いと仮定していますが、いずれの方法でも1TBのフラッシュストレージを搭載した32gのマシンで動作しています)。 ...次のコメント... –

+0

... ...データがロードされたら、JDBCを使用してデータベース上でクエリを実行します(Hibernateの場合もありますか? )。クエリは、クライアントからのWebブラウザのテキストフィールドから来るので、この後の私の次のステップは、その文字列を取得して実行するロジスティクスになります。これが大きな間違ったことがあれば、助けてくれてありがとう!私に教えてください! –

+1

データのロード後にJDBCを使用してデータをロードしたり、管理可能な行数でCRUD操作を実行したりすることは、データをロードした後には大変です。 –

関連する問題