ログエントリをDBに書き込む必要がある場合、ログの問題を作成しています。ただし、トランザクションで実行され、ロールバックによって実行されるプロセスは、新しいログエントリも削除されます。トランザクションから DB に書き込みを行うことはできますか? NO-UNDOオプションを使用してtemptableに書き込むようなもの...?新しい logentries がまだ DB に残っていること...?
6 に答える
もう1つのオプションは、単純なメッセージングシステムを使用することです。セットアップと使用が非常に簡単なオプションの1つは、STOMPです。プラットフォームに依存せず、非常に簡単に使用できます。
Julian Lyndon-Smithは、約1か月前にPEGに次のように投稿しました。彼が言うように、セットアップと使用は本当に簡単です(試してみましたが、セットアップと使用も非常に簡単なApacheMQを使用しました)。
dot.rは、ボストンとフィンランドでのプレゼンテーションに続き、すぐに利用できるオープンソースのStompプロジェクトを発表できることを嬉しく思います。
http://www.dotr.comまたは https://bitbucket.org/jmls/stompからダウンロードします。dot.rstompプログラムを使用すると、進行状況セッションを、同じに接続されている他のアプリケーションまたはサービスに接続できます。メッセージブローカー。
Stompをサポートするオープンソースの無料メッセージブローカーは次のとおりです。
ヒューズ
(http://fusesource.com/products/fuse-mq-enterprise/)[現在RedHatincが所有するProgress会社]FuseMQ Enterpriseは、非常に小さなフットプリントで展開する標準ベースのオープンソースメッセージングプラットフォームです。ライセンス料の不足と、あらゆる開発環境で使用できる高性能で信頼性の高いメッセージングを組み合わせることで、あらゆる場所での統合をサポートするソリューションが提供されます。
ActiveMQ
Apache ActiveMQ(tm)(http://activemq.apache.org/)は、最も人気があり強力なオープンソースメッセージングおよび統合パターンサーバーです。Apache ActiveMQは高速で、多くのクロスランゲージクライアントとプロトコルをサポートし、JMS1.1とJ2EE1.4を完全にサポートしながら、使いやすいエンタープライズ統合パターンと多くの高度な機能を備えています。
Apache ActiveMQは、Apache2.0ライセンスの下でリリースされています。
RabbitMQ
RabbitMQはメッセージブローカーです。主要な考え方は非常に単純です。メッセージを受け入れて転送します。あなたはそれを郵便局と考えることができます:あなたが郵便ポストに郵便物を送るとき、あなたは郵便配達人氏が最終的にあなたの受取人に郵便物を配達することをかなり確信しています。このメタファーを使用すると、RabbitMQは郵便ポスト、郵便局、郵便配達員になります。
RabbitMQと郵便局の主な違いは、紙を処理せず、代わりにデータのバイナリブロブ(メッセージ)を受け入れ、保存し、転送するという事実です。
https://bitbucket.org/jmls/stomp問題システムに問題をログに記録し、 追加するすべての新機能をコミットするためにプロジェクトをフォークしてください...
dot.r StompはパーミッシブMITライセンスを使用しています(http://en.wikipedia.org/wiki/MIT_License)
楽しんで、楽しんでください!
ジュリアン
もう 1 つの可能性は、アプリ サーバーを使用することです。アプリ サーバー セッションでのトランザクションは、元のセッションでのトランザクションから独立しています (これが、オプションで冗長な "DISTINCT TRANSACTION" 構文のすべてです)。
ログエントリを元に戻さない一時テーブルに書き込みます。コードがトランザクションをコミットする場合、またはトランザクションがアクティブでない場合 (transactionID = ?)、コードでログ エントリを書き出すようにします。
元に戻せない一時テーブルのアイデアが気に入っていますが、未処理の例外が発生した場合に備えて、データベースの書き込み部分を「FINALLY」ブロックに入れるようにしてください。
あなたが計画したように、ABLでこれを行う方法はないと思います(一時テーブルのフラッシュやその他のちょっとしたことをあちこちに振りかけるのはひどいです)または確実に(アプリケーションがフラッシュされていないtemp-でクラッシュした場合はどうなりますか)表?)、他の人が言及したように。データベースの書き込みを非同期にし、可能であればアプリケーションの外部で発生させることにより、複雑なロギングをアプリとの結合を少なくすることをお勧めします。
Windows を使用しているため、ロギングを変更して、ABL コンストラクトの代わりに.NET log4netライブラリを使用できます。log4net には便利なアペンダーがいくつかあります。
- データベースに直接ログを記録できるAdoNetAppender
- syslog プロトコルを使用するRemoteSyslogAppenderにより、外部の Unix syslog またはrsyslogデーモンにログを記録できます (rsyslog は、データベースへのログ メッセージの書き込みをサポートします)。
- UDPAppenderは、UDP パケットを介してログ メッセージを送信し、別の場所で処理します (たとえば、データベースへの書き込みをサポートするlogFacesサーバー) 。
ABL で実行する必要がある場合は、ログ メッセージ専用の名前付き出力ストリームを使用できます ( OUTPUT TO STREAM
)。これは、外部プロセスがリッスンして処理する特定の場所に書き込みます。このファイルは、何かによって作成されたパイプであるmkfifo
か、変更が監視されている通常のテキスト ファイルである可能性がありますinotify
(これらの Windows の同等物が何であるかはわかりません)。この外部プロセスは、メッセージの解析とデータベースへの書き込みを処理します (基本的には rsyslog を再発明します)。
データベースへのすべての変更は、トランザクションの一部である必要があります。明示的に開始しない場合は、暗黙的に開始され、トランザクション機能を持つ次の外部ブロックにスコープされます。
ただし、お勧めしませんが、サブトランザクションを使用してください。トランザクション スコープ内で DO TRANSACTION を明示的に指定することにより、サブ トランザクションを呼び出すことができます。データベースはそれを認識しませんが、データベースがトランザクションをコミットできる間、クライアントはサブ トランザクションをロールバックできます。
しかし、このようなものを実装するには、トランザクション スコープ、ブロック動作、およびエラー処理の概念を習得する必要があります。
リアルヘビーデュード。