著作一覧 |
まだ問題がある。
配送先の突然死の監視ロジック。
前提から、MAX(SEQ)が等しいかはだめだ。(SEQEUNCEキャッシュを無効にすればOKだし、timestamp方式でも多分OK)
効率的には最悪だが処理的には確実なのはCOUNTでロウ数のチェック。突然死と言ったってプロセスは生きているがイヤンなところに入り込む可能性(プログラム自身の問題と、JDBCドライバに起因する問題などさまざま)があるからメッセージそのものについての何かを監視すべきだろう。
配送元(というかポールで良ければ単純にQUEUEに見立てたテーブルへのINSERTで良いと前提しているわけだから)キーに利用する値をSEQUENCEやTIMESTAMPのように外部から取るではなく、こんなのもありかも。
INSERT INTO XXX VALUES (SELECT MAX(SEQ) FROM ... + 1, DATA)
と一瞬思ったけど排他制御ができないからだめかな? それは一意制約違反に引っ掛かったら再試行すれば良いだけだ。と思う。MAX関数の負荷ってどんなもんだろうか?
ジェズイットを見習え |