[三流君] −−> [ASPで遊ぶ、失敗する] −−> [バックナンバー一覧]
−−> No.063 Application.Lock .Unlockを使ってみた

Application.Lock .Unlockを使ってみた



本文(発行内容)


<Application.Lock .Unlockを使ってみた>

こんにちは、三流プログラマーのKen3です。 今回は、 同時アクセス、排他制御もどきで、 Application.Lock .Unlockを使ってみた そんなお話です。

/* * 1.今回のキッカケ */

HPで訪問者のログを収集してます。 DBに追加されていくので、削除しないとデータが増えてしまいます。 ※当たり前でしょ(笑) 自社のサーバーなら、日替わり処理で、 タスクのスケジュールで、 SQL Delete文を発行すれば、済んでしまうんだけど、 レンタルサーバーだと、そんな処理タイミングを作ることが出来ません。 面倒だけど、削除のSQL文が入ったASPファイルを自分で実行してました。 なんとか、自動化できないかなぁ、、、と考えてて、 その日初めて起動した時に、8日前のデータを消すことにチャレンジしてみました。 ※今のところ、うまくいってます。

/* * 2.手で走らせてた削除のSQL文 */

下記のような感じで、SQL文を作り、 strSQL = "Delete From log " '現在時刻、日付型は#で囲む strSQL = strSQL & "Where WriteTime < #" & DateAdd("d", -7, Date) & "#" 削除のSQLを db.Execute(strSQL) で発行してました。
Sub DeleteMDB()

  'ADO DB Connection オブジェクトを作成する、英文そのままじゃん
  Set db=Server.CreateObject("ADODB.Connection")

  '.Provider?プロバイダー?通信会社?じゃなくって
  'データアクセスにはJet.OLEDB.4.0を使うことを設定
  db.Provider = "Microsoft.Jet.OLEDB.4.0"

  '次に、接続DBの位置を渡すので、Server.MapPathで変換して渡す
  db.ConnectionString = Server.MapPath("../test/cnt.mdb")

  'やっとデータベースを開ける
  db.open

  'SQL文を作る
  strSQL = "Delete From log "      '現在時刻、日付型は#で囲む
  strSQL = strSQL & "Where WriteTime < #" & DateAdd("d", -7, Date) & "#"
  'SQL文を発行
  db.Execute(strSQL)

  'データベースも閉じようよ
  db.Close

  'お行儀よくオブジェクトも開放しましょう(通常は自動的に解放されるけど)
  Set db = Nothing

End Sub
この削除の関数を、 その日、はじめて来た訪問者に実行させたくて、 共通のApplication変数に削除実施日を保存しておき、 現在時刻と削除実施日が違った場合のみ削除処理が走るように、 細工してみたいと思います。

/* * 3.ロック処理で細工する */

作成した、削除のSQLを初回だけ呼ぶルーチンです。 <% '日付の管理 Application.Lock 'ロックの設定 Application("LOCK_FLG") = "ON" '日替わりチェック WTEMP = Application("SDATE") DEL_FLG = "OFF" If WTEMP <> Date Then Application("SDATE") = Date '日付の代入 DEL_FLG = "ON" End If Application.UnLock 'ロックの解除 '日替わり削除処理を呼ぶか判断 If DEL_FLG = "ON" Then Call DeleteMDB() End If %> 同時にアクセスされて、変数を壊されるのがイヤだったので、 Application.Lock と Applicationオブジェクトへのアクセスをロックします。 Application("LOCK_FLG") = "ON" なんて意味深なことやっているけど、これは、気にしないでください。 ※変数名に意味は無く、代入処理に意味があります。 フラグは使ってないんですね(笑) AさんとBさんがほぼ同時にアクセスしてきました。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Aさん      Bさん Application.Lock 'ロックの設定 Application.Lock 'ロックの設定 Application("LOCK_FLG") = "ON" Application("LOCK_FLG") = "ON" '日替わりチェック '日替わりチェック WTEMP = Application("SDATE") WTEMP = Application("SDATE") DEL_FLG = "OFF" DEL_FLG = "OFF" If WTEMP <> Date Then If WTEMP <> Date Then Application("SDATE") = Date Application("SDATE") = Date DEL_FLG = "ON" DEL_FLG = "ON" End If End If Application.UnLock 'ロックの解除 Application.UnLock 'ロックの解除 すると、Aさんのほうが少し早かったので、 先にApplication.Lockをかけました。 Bさんは、少し遅れてApplication.Lock の要求を出しました。 Aさんの Application("LOCK_FLG") = "ON" は、普通にアプリケーション変数LOCK_FLGにONって文字列をセットします。 Bさんも、セットしようとアプリケーション変数LOCK_FLGにアクセスするも、 Aさんのかけた.Lockのおかげで、ここで解除となるまでまたされます。 Aさんの処理が進むと、 Application.UnLock 'ロックの解除 とロックが解除されます。 で、やっとBさんの処理、 Application("LOCK_FLG") = "ON" が開始されます。 こんな流れを作りたかったので、 Application.Lock Application.UnLock と Application("変数名") = "" で 小細工してみました。

/* * 4.終わりの挨拶 </HTML> */

同時アクセス数が少なかったり、 止めて処理しているのが日付の比較だけなので(軽い処理なので) ロックしている時間が短く、今のところ影響なく動作しています。 今回の処理は、別に2回、3回削除のSQL文走っても実害は無かったのですが、 ユニークな連番を振る処理などで、 排他的な処理をする時 And 軽めの処理限定で、 Application.Lock Application.UnLock を使うのも1つの手だなぁと思います。 何かの参考となれば幸いです。 ASP、VBScript勉強中の三流プログラマーのKen3でした。


ページフッター

ここまで、読んでいただきどうもです。目的の情報が見つかったか?少々心配しつつ、、、

三流君へ メッセージを送る

感想や質問・要望・苦情など 三流君へメッセージを送る。
返信例 XXXXさんへ
下記のフォームからメッセージを送ることができます。


あなたのお名前(ニックネーム):さん
返信は?:

アドレス:に返事をもらいたい
感想や質問↓:


(感想や質問・要望・苦情はHPで記事に載せることがあります。)

種類別のリンク や 広告など

[三流君(TOP ken3.org へ戻る)] / [ASPで遊ぶ、失敗する] / [ASP記事 バックナンバー目次]


Blogとリンク:[三流君のMemo別館]/ [ASP 三流君のソースコード置き場]/ [Ken3Video YouTubeで動画解説]
広告:

気になった ジャンル ↓を選択してください。

まぁ、基本はデータの受け取りかなぁ。
・[Form等を使用したデータのやり取り]・・・ASPと言っても、HTMLの入力フォームからデータを受け取ります。POSTやGETでやりとりを押さえますか。

次は、データの入出力 で ADOを使った(ADOで接続) と SQLの解説を少々
・[ADOでMdbファイルを使う]・・・MDBと接続して、簡単な追加・更新・削除を行った。
・[ADOでExcelと接続してみた]・・・.xlsと接続してSQLを使ってみた。
・[ADOでCSVと接続してみた]・・・.CSV テキストを読み出した。※更新・削除はできません

広告:



DBが使えるので、あまり使用しないけど、普通のテキストファイル処理
・[テキストファイル処理]・・・ファイルを開いて、書き込む。1行読み込みなどを軽く

VBScriptでFormat関数が無いなど、微妙にVBAと違うけど
[VBScript関数関係の説明]・・・少し、処理を書いてみた。
[その他処理サンプル]・・・あまり良いサンプル作れなかったけど。。。
何かの参考となれば幸いです。



[三流君(TOP ken3.org へ戻る)] / [ASPで遊ぶ、失敗する] / [ASP記事 バックナンバー目次]


広告: