が含まれています.IBM Informix、MySQL、およびOracleのいずれかで動作するアプリケーションがあります.HibernateでJavaを使用してデータベースに接続しています。 XML、CSVなどのテキストベースのファイルをデータベース(clob列)に保存します。 Javaのエンティティはbyte[]
オブジェクトです。Informix、MySQL、およびOracle blobには、
アプリケーションへの1つの機能要求が、データ内のコンテンツを "grep"するようになりました。だから私は特定のコンテンツを持つすべてのファイルを見つける必要があります。
通常のchar/varcharフィールドでは、like '%xyz%'
を使用できますが、これはバイト[]/blobでは機能しません。
最初の方法は、各エンティティをロードし、byte[]
を文字列にキャストし、Javaでcontains
メソッドを使用することでした。使用で他の(非clob)列のフィルタパラメータが入力された場合、私はスキャンする必要のあるブロブの数を減らすためにclobをテストする前にこれらのフィルタを適用します。
これは、アプリケーションとデータベースが同じサーバー上にある限り、100個のファイル(clob)に対して非常にうまく機能しました。しかし、データベース内に1.000.000個のファイルがあり、データベースが常に同じネットワークにあるとは限りません。だから私はそれは良い考えではないと思う。
私の次の考えは、データベースプロシージャを作成することでした。しかし、これがInformix、MySQL、Oracleで可能かどうかはよく分かりません。これが可能かどうかはわかりません。
最後に、好ましくない方法は、データの内容をクローブ内に保存することです。たぶん私は別のデータ型を使うことができますか?
これを実現する方法は誰にも分かりますか?私は、3つのDBMSすべての解決策が必要です。アプリケーションは、接続されているDBMSの種類を知っています。だから私は3つの異なるソリューション(各DBMSに1つ)があれば大丈夫でしょう。
私が使用しているデータ型の種類(BLOB、CLOB ...)を変更することは完全に公開されています。
注:clobsは約5 KiBから約500 KiBの範囲で、最大1Mbです。
各BLOB/CLOBオブジェクトのサイズはどれくらいですか? KiB、MiB、GiB、それ以上?オブジェクトが大きく、その数が多いほど、オブジェクトのそれぞれをクライアントコードに戻して、使用するかどうかを確認することが悪いほど、心配するのは正しいです。フィルタリングがサーバー側で行われていることを確認することが重要です。 –
各エントリは約5kbから500kbまでです。 1ファイルあたり最大1MBです。そして、フィルタのパラメータが入力された場合は、前にフィルタリングして、スキャンするブロブの数を減らします。 – Hauke
ほとんどのデータベースは、非構造化テキストデータのフリーフォームGoogle検索のような機能を備えています。バイナリデータではないので、 'blob'ではなく' clob'カラムにデータを格納したいと思うでしょう。次に、何らかのテキスト索引を作成します(Oracleでは、探している機能はOracle Textです)。しかし、各データベースの実装は非常にユニークなものになるでしょう。これは、ANSI標準のSQLで照会するものではありません。 –