2012-04-30 9 views
2

テーブルが170万レコードあるMySQLデータベースを使用しています。 JavaのRestletフレームワークを通して、これらのレコードをフェッチしてクライアントに返したいと思っています。私はリモートサーバーであるLinux Centosを使用しています。 WARファイルを作成してサーバーにアップロードしました。私がサービスを実行すると、応答するのに多くの時間がかかります。私は40分待ちましたが、何の出力も得られませんでした。 誰でもこの問題を解決するために私を助けてもらえますか?Javaで1.7百万レコードを取り込む方法は?

+2

何かのページ付けを追加し、クライアントがレコードのオフセットを指定し、すべてのフェッチでレコードをn個に制限できるようにアドバイスします。それはあなたの問題を単純化することができます。一気にRESTを使った170万レコードが確実にあまりにも多く聞こえる –

+2

なぜ地球上でその数多くのレコードを取得しようとしたいのですか? –

+0

クライアントに170万のレコード全体を表示する予定ですか?私はあなたのブラウザもそれを処理することができなくなる恐れがあります。 – Kshitij

答えて

0

私は非常に多数の行を持っていますが、メモリマップされたファイルを使用しています。例えば私は約1分で11億行を取り出して処理しなければならないデータベースが1つあります。 (その200 GB以上)

これは非常に専門的なアプローチであり、SQLデータベースを調整する方法や、NoSQLデータベースを使用して必要なことをする方法があると思われます。私はあなたが何をしているのかに応じて1分間に170万分を取得することができますが(例えば、この数多くのamoungst数TBを選択するとしばらく時間がかかることがあります)

しかし、オプションを使用すると、カスタムデータストアを作成できます。

ところで、要約のみが作成されます。誰もその行を読んではいけません。ブラウザに表示しないでください。おそらく、レポートや要約を作成するためにできることがあるので、クライアントを送ることが少なくなります。

+0

こんにちはPeter、返事ありがとうございます。はい私は、他のテーブルの結果を使用して、あるテーブルからレコードを選択しています。 – Deepu

+0

この場合、最初にチェックするのはあなたのインデックスがテーブル間のジョインに最適であるかどうかです。 –

4

これはおそらくうまくいかないでしょう。メモリ内の多くの行のデータを保持すると、メモリ不足の例外が発生します(サーバーのログを見て、正確に何が起こっているのか確認できます)。

このようなことをするには、その計画を放棄して何らかの並べ替えを行う必要があります。そうしないと、メモリに保持せずにレコードをクライアントにストリーミングできるソリューションが必要になります。私は、Restletフレームワークでこれを可能にすることは確信しています。おそらく、サーブレットを使って実装する必要があります。

+0

あなたの返信をありがとう、私はそれを試してみます。 – Deepu

0

私のアプリでは、この種の仕事は成功しています。あなたのクライアントが大きな反応を受け入れる準備ができているなら、そのアプローチに間違いはありません。要点は、レスポンスをストリーミングする必要があることです。つまり、レスポンス全体を文字列として作成することはできません。 HTTPレスポンスの出力ストリームを取得し、レコードを1つずつ書き込む。 db-endでは、スクロール可能な結果セットを設定する必要があります(JDBCレベル、およびHibernateレベルで簡単に行うことができます)。

+0

こんにちはマルコ、返信いただきありがとうございます。スクロール可能な結果セットを使用しています。これをHTTPの出力ストリームで試してみます。 – Deepu

+0

パフォーマンスをどのように向上させることができますか? –

関連する問題