我使用Apache2.2(worker)/ mod_perl 2.0.4/Apache :: DBI/CGI :: Session和Firebird RDBMS。DBI緩存語句消失,CGI :: Session被阻塞
我還寫了CGI :: Session :: Driver :: firebird.pm來與Firebird RDBMS一起工作。 DB連接由Apache :: DBI彙集,併爲CGI :: Session {Handle => $ dbh}提供連接句柄。
DB連接的數量等於工作進程的數量。
我發佈了Programming with Apache::DBI and firebird. Get Stucked httpd on exception 3個月前。 我發現了這個問題的原因,並想知道如何解決它。
$dbh = DBI->connect("dbi:Firebird:db=$DBSERVER:/home/cdbs/xxnet.fdb;
ib_charset=UTF8;ib_dialect=3",$DBUSER,$DBPASS,{
AutoCommit=>1,
LongReadLen=>8192,
RaiseError=>1
});
my $session = new CGI::Session('dbi:firebird',$sessid,{Handle=>$dbh});
my $ses_p1 = $session->param('p1');
eval { $dbh->begin_work()
my $sql = "SELECT * FROM SAMPLETABLE"
my $st = $dbh->prepare($sql);
$st->execute();
while (my $R = $st->fetchrow_hashref()) {
...
}
$st->finish();
}; warn [email protected] if [email protected];
if ([email protected]) {
$dbh->rollback();
}else{
$dbh->commit();
}
$session->flush();
發生sql錯誤時,eval塊會捕獲異常和回滾事務。 之後,CGI :: Session不再檢索會話對象。
由於prepare_cached語句在CGI :: Session :: DBI.pm失敗。 CGI :: Session :: DBI.pm使用prepare_cached($ sql,undef,3)。 '3'是使用緩存語句最安全的方式,但在這種情況下,它絕不會發現破壞語句。
如何解決這個問題? 提出改變CGI :: Session :: DBI.pm使用prepare()語句的請求? 在firebird.pm中使用prepare()語句寫入store(),retrieve(),traverse()函數?
可能其他prepare_cached()去捕獲異常後失敗...
1)我的CGI ::會話級> errstr() 添加模具發言中,我得到了一個錯誤「新的( ):失敗:load():無法檢索data:retrieve():$ sth->執行失敗,顯示錯誤消息「 2)如果$ session有效,則會話 - >加載() 後刷新會話對象,被存儲到數據庫。 3)我將begin_work()替換爲{AutoCommit} = 0 結果相同。在捕獲異常和回滾之後,我可以正常使用$ dbh,但是新的CGI :: Session返回錯誤。 ------------------------------------------ added 2017/07/26 18 :47 JST
請給我你的建議。
謝謝。
''session-> flush'殺死會話?也許有人希望從'$ sessid'中刪除任何值? –
$ session-> flush()不會引發任何異常。 $ session-> flush()之後,另一個查詢運行良好,但下一個「新CGI :: Session()」返回空。 CGI :: Session-> load()返回undef。 –
我也通過刪除$ session-> flush()來測試它,但下一個CGI:Session返回空。 –