- PR -

WebアプリケーションでPostgreSQLにバイナリデータ格納

1
投稿者投稿内容
koji
大ベテラン
会議室デビュー日: 2002/12/25
投稿数: 100
投稿日時: 2003-12-17 15:04
Servlet/JSPでWebアプリケーションを作成しています。
クライアントのブラウザの入力フォームよりローカルファイル(バイナリ)を
指定して、サーバのPostgreSQLに挿入したいのですが、色々探してみても方法
がわかりませんでした。ご存知の方いましたらご教授お願いします。また、参考
になるサイト等ありましたら教えてください。

サーバ構成は、
OS:Red Hat Linux 9
アプリケーションサーバ:JBOSS3.2.2(Tomcatバンドル版)
データベースostgreSQL7.3
です。
がるがる
ぬし
会議室デビュー日: 2002/04/12
投稿数: 873
投稿日時: 2003-12-17 15:21
ども。がると申します。
なんとなく、最近同じような質問に回答していたような気が
するのですが^^;

ちと変則技ですが。
Base64という方式でバイナリをエンコードすると、普通に
文字列になります。
サイズが約4/3倍になりますが、DBMSを選ばない手法なので
便利ですよ。
おばけ
ぬし
会議室デビュー日: 2002/11/14
投稿数: 609
お住まい・勤務地: 東京都江東区
投稿日時: 2003-12-17 15:39
引用:

色々探してみても方法がわかりませんでした


状況を整理してみましょう。
この要求は、

  1. クライアントのローカルにあるバイナリファイルをサーバにアップロードしたい
  2. アップロードされたファイルをデータベースに投入したい

という風に分解されますね。
まず、1に関しては「Servlet」、「ファイルアップロード」といったキーワードで検索
(別に@ITだけじゃないです。Googleとかで良いですよ)をしてみましょう。
2に関しては、基本的にデータベースには依らないことだと思いますので、「JDBC」や
「BLOB」というキーワードで検索してみましょう

実際に両方ともGoogleで検索しましたが、1位もしくは上位にかなり良さそうなページが
ヒットしますよ。あとは、そこで調べて頑張りましょう

もしそれらの解説を読んで試してみても分からないところがあれば、その時はまた
ここに聞きに来たら良いと思います。まずは、試してみましょうね。
koji
大ベテラン
会議室デビュー日: 2002/12/25
投稿数: 100
投稿日時: 2003-12-17 16:34
がるがるさん、おばけさん、ありがとうございます。


がるがるさんへ

>Base64という方式で...
なるほど、4/3程度ならこの方法は色々なところで活用できそうですね。


おばけさんへ

ありがとうございます。試してみます。
1.2.という手順でやれば出来るなぁ、とは思っていたのですが、1.で一度
ファイルをサーバ上に保存してやるのか、またはファイルに保存する前のストリ
ームをDBに書き込むようにすれば良いのか?このあたりの、やり方というかセオ
リーみたいなものがあれば、参考にしたいという事だったのです。説明不足です
いません。まずは、試してみます。

おばけ
ぬし
会議室デビュー日: 2002/11/14
投稿数: 609
お住まい・勤務地: 東京都江東区
投稿日時: 2003-12-17 16:47
引用:

1.で一度ファイルをサーバ上に保存してやるのか、またはファイルに保存する
前のストリームをDBに書き込むようにすれば良いのか?このあたりの、やり方というかセオリーみたいなものがあれば、参考にしたいという事だったのです。


なるほど。そう言うことでしたか。

まず、テンポラリファイルに保存する方法では、以下の問題に気を配る必要が
あるでしょう。

  1. テンポラリファイルのお掃除のタイミング
  2. テンポラリファイルを書き込む領域のサイズ
  3. パフォーマンスの劣化
  4. 最大ファイル記述子サイズ

お掃除はDBへの書き込み後に行いますが、コンテナがまるごと死んだ場合等も
考えると、どこかでバッチを使ってお掃除する必要があります。
また、実行に当たっては当然十分なテンポラリDISK領域を確保する必要が
あります。ここは、同時実行数×テンポラリファイルサイズで求まりますね。
他にも、ファイルI/Oを伴いますので、その分のパフォーマンス劣化はあるでしょう。
また、ファイル数が膨大な場合は、1プロセス当たりオープンできるファイル記述子
の数にも気をつけなければなりません。

他方、テンポラリファイルを用いない場合、オンメモリで処理するので以下の問題に
気をつけないといけません。

  1. テンポラリデータのサイズ
  2. 最大ヒープ領域サイズ

特に、Javaの場合Windows上ではJVM一つ当たりのヒープがせいぜい使えて900MB程度
ですから、かなり深刻です。また、ヒープサイズを増大させると、FullGC時の
パフォーマンス劣化も問題です。

まあ、どちらが良いとは言えませんが、上記の点に考慮してオンメモリかテンポラリ
ファイルかを選ばれると良いでしょうね。

私なら、あまり頻繁でなく(つまり同時に幾つも処理が起こる可能性が低い)、かつ
ファイルサイズが小さい(数KB〜数十KB程度)なら、オンメモリで処理しますね。
テンポラリファイルのお掃除は面倒ですからね。
koji
大ベテラン
会議室デビュー日: 2002/12/25
投稿数: 100
投稿日時: 2003-12-17 16:56
おばけさん、詳しい説明をありがとうございます!
非常に参考になりました。おばけさんの言う、

>あまり頻繁でなく(つまり同時に幾つも処理が起こる可能性が低い)、かつ
>ファイルサイズが小さい(数KB〜数十KB程度)

というケースに一致しますので、この方法で実装にチャレンジしてみます。
ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)