私はApache2.2(worker)/ mod_perl 2.0.4/Apache :: DBI/CGI :: SessionとFirebird RDBMSを使用しています。DBIキャッシュステートメントがなくなり、CGI :: Sessionが貼り付けられました
また、Firebird RDBMSで動作するCGI :: Session :: Driver :: firebird.pmも書いています。 DB接続はApache :: DBIによってプールされ、CGI :: Session {Handle => $ dbh}への接続ハンドルを与えます。
DB接続の数は、ワーカープロセスの数と同じです。
私はProgramming with Apache::DBI and firebird. Get Stucked httpd on exceptionを3ヶ月前に投稿しました。 私はその問題の理由を見つけ、それを修正する方法を知りたいと思っています。
SQLエラーが発生すると、evalブロックは例外トランザクションとロールバックトランザクションをキャッチします。 その後、CGI :: Sessionはセッションオブジェクトをそれ以上取得しません。
prepare_cached文がCGI :: Session :: DBI.pmで失敗するためです。 CGI :: Session :: DBI.pmはprepare_cached($ sql、undef、3)を使用します。 '3'はキャッシュされたステートメントを使用する最も安全な方法ですが、この状況ではステートメントが見つからないことはありません。
これを修正するにはどうすればよいですか? prepare()文を使用するためにCGI :: Session :: DBI.pmを変更するリクエストを発行しますか? prepare()文を使用するには、store()、retrieve()、traverse()関数をfirebird.pmに書き込みますか?
それは他のprepare_cached()キャッチ例外後に失敗するつもりはあり...
1)私は「新しいエラーを得たCGI ::セッション - > errstrは() にダイのステートメントを追加します( 2)私はsession-> load()の後にセッションオブジェクトをフラッシュする $ sessionが有効であれば、変更が行われます。エラーが発生した場合、$ sth-> executeは失敗します。 DBに格納されます。 3)begin_work()を{AutoCommit} = 0に置き換えます。 結果は同じです。私は通常、例外とロールバックをキャッチした後に$ dbhを使用できますが、新しいCGI :: Sessionはエラーを返します。 ------------------------------------------追加された2017/07/26 18 :47 JST
私にあなたの提案をしてください。
ありがとうございます。
おそらく 'session-> flush'がセッションを終了しますか?おそらく1つは '$ sessid'から任意の値を削除すると予想されますか? –
$ session-> flush()は例外を発生させません。 $ session-> flush()の後に別のクエリがうまくいきますが、次の "新しいCGI :: Session()"は空を返します。 CGI :: Session-> load()はundefを返します。 –
私は$ session-> flush()を取り除いてもテストしましたが、次のCGI:Sessionは空を返しました。 –