2009-04-15 5 views
1

私は生データを読み取り、これを数秒ごとにデータベースに書き込むプロセスを持っています。データベースの変更をリスンする最も互換性のある方法は?

データベースに書き込まれているかどうかを確認する最良の方法は何ですか?私はOracleとMS-SQLがトリガなどを使って他のサービスと通信できることを知っていますが、より多くのタイプのSQLデータベース(SQL Lite、MySQL、PostGRES)で動作するテクニックがあることを期待していました。

答えて

1

あなたの質問には、良い答えに必要な詳細が欠けていますが、私はそれを試してみましょう。トリガーはテーブルをターゲティングするのに適していますが、システム全体の書き込みに興味がある場合は、より保守しやすい方法が必要です。システム全体の書き込みについては、トランザクションログの変更を検出するメソッドを調べます。残念なことに、各ベンダーはこの部分を別々に実装しているため、すべてのベンダーにとって有効な方法はありません。つまり、データベースサーバー内で動作するメソッドはありそうにありません。しかし、OSレベルでサーバーの外にもっと洗練された方法があるかもしれません。たとえば、トランザクションログがディスク上のファイルである場合、ファイルの変更を検出する単純なスクリプトは、DBが書き込まれたことを示します。

db書込みの検出のみを要求していることに注意してください。どのタイプの書き込みであるかを知る必要がある場合は、トランザクションログに何があるかを知る必要があります。そしてそれは間違いなくベンダー特有のものです。

0

あなたのやりたいことによって異なります。それがキックオフされる必要のあるデータベースの外部のものであれば、データベースの単純なポーリングがトリックを行います。そうでなければ、db固有のトリガーがおそらく最も適しています。

+0

私は非ポーリングソリューションを望んでいましたが、一般化できるソリューションがあるかどうかはわかりません。 – CookieOfFortune

0

データベースに依存しない場合は、ポーリングが機能します。非常に効率的でエレガントではありません。また、トリガーをサポートしていないデータベースを使用することに呪われている場合にも機能します。過去に使用した回避策は、select MAX(primary_key_id) from saidTableを実行するために時間を計られたスクリプト(cronなど)を使用することです。私はあなたのプライマリキーが連続した整数でインデックスされていると仮定しています。

次に、前回スクリプトを実行したときの値と比較してください。一致する場合は、スクリプトに終了またはスリープを指示します。そうでなければ、あなたのことをしてください。

このアプローチには他にも問題があります(スクリプトが長すぎる場合はバックログ、同時実行性の問題など)。もちろん、パフォーマンスも問題になります!

関連する問題