[三流君] −−>
[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でした。
ページフッター
ここまで、読んでいただきどうもです。目的の情報が見つかったか?少々心配しつつ、、、
三流君へ メッセージを送る
感想や質問・要望・苦情など 三流君へメッセージを送る。
下記のフォームからメッセージを送ることができます。
種類別のリンク や 広告など
[三流君(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記事 バックナンバー目次]
広告: