2011-11-10 11 views
3

データベースに複数のファイルをアップロードし、それらを特定のテーブルの特定のレコードに関連付けることができる必要があります。最初は必要なすべてのファイルを圧縮し、結果のバイト配列を残りのレコードデータとともにストアドプロシージャに送信しました。これにより、これが単一のトランザクションとして機能し、関連するすべてのファイルを取得することができます与えられた記録はケーキの一片になるでしょう。しかし、この計画は、パフォーマンス上の理由で受け入れられなかった、そして今、私は2つの選択肢が残っています:データベースへのファイルのアップロード

  1. は、byte[]の配列をラップするデータ構造を作成します(バイナリレベル)、それをシリアル化し、それを一緒に送りますデータ;または

  2. まず、残りのデータを送信し、レコードのIDをキャッチし、各ファイルを個別に送信します(指定されたIDに関連付けます)。

今、1)は私の最初の計画によく似ており、この時間は圧縮されていなくても拒否される可能性があります。オプション2)は行く方法だと思われますが、レコードのデータとファイルを1つのトランザクションでアップロードすることを保証しなければなりません。これにより、私のデータレイヤーに(わずかながらですが)変更が強制されます。

この問題が発生した場合は、どのオプションを選択しますか?私が上記のいずれにも該当しない場合、どちらが当てはまるのでしょうか?

編集:データベースはリモートサーバーにあります。ファイルは任意に大きくすることができますが、私はそれらが例えば1〜2MBよりも大きくなることは期待していません。アプリケーションとデータベースサーバーの両方からアクセス可能な場所にファイルを格納することはオプションではないので、ファイルへのパスをデータベースに送信するだけで済むわけではありません(実際にはデータベースにBLOBとして格納する必要があります)。

私たちは、時間とファイルの予想サイズで、我々のニーズに応じて、このための2つの異なるシナリオを使用
+0

ファイルの大きさは、実行中のアプリケーションのローカルデータベースです。 –

+0

質問を編集しました。どうもありがとう! – DotNetStudent

+1

あなたは本当にデータベースにファイルを保存したくありません。 –

答えて

1

あなたの最初の計画はパフォーマンスの問題により拒否されました。おそらく、これはネットワーク転送速度を意味しますか?

別の計画では、ファイルを個別に送信して、&をサーバーにまとめて送信します。それは素晴らしい計画ですが、すべてのファイルが1回のトランザクションでアップロードおよびコミットされるようにしたいとします。それ以降、サーバーはすべてのファイルを受信して​​正常にコミットするまで、成功信号で応答することはできません。

したがって、2番目のシナリオでは、トランザクションでアップロードするデータの量が同じである必要があります。どのようにしてより良い結果を出すことができますか?

実際には、ファイルを1回のトランザクションで受信する必要があると仮定した場合、考えられる設計は同じ 'パフォーマンス上の問題'があります。

あなたは「トランザクション」について理解している可能性がありますが、トランザクションが完了するまでは、通常、最初に送信した「残りのデータ」を使用することはできません。あなたの問題は、ネットワークのボトルネックではなく、システムの必須の「単一トランザクション」の性質にあると思います。

0

1)当社は、受信システムにファイルをストリーミングし、それらは、よく知られた場所にキャッシュされています(つまり、ファイル名のGUIDを使用する一時的なディレクトリ)に格納されます。これは、パフォーマンスを向上させるために非同期で行うことができます。受信システムがファイルを見つけることができるように、ファイルに関連付けられたレコードに参照(GUIDなど)を使用できるようにする必要があります。レコードがデータベースに書き込まれると、ファイルの内容をパラメーター(ストアード・プロシージャー・パラメーター)にストリーミングし、最短時間の間メモリーに格納します。

2)ファイルが比較的小さい場合、それらをレコードのバイト配列にストリームします。これは確かに実装するのが最も簡単ですが、ファイルが大規模である場合は、レコードを「有線経由で」送信するときにパフォーマンスをいくらかコントロールできなくなります。

関連する問題