📄 websnap.txt
字号:
按照code6421兄的办法搞定了。在APACHE下可以访问了。
不过我的程式还有问题。如果是2个人同时访问,就死掉了。估计是程式本身的问题。
另一个怪问题是,同一段Soruce,就是这个WebSnap的程式,我拷贝到另一台机器上,同样是D6,居然Build出来的DLL文件大小不一样。相差很远。一个和这个DLL完全相同的DEBUG程式也有同样问题,在一台机器上Build出来的Exe文件是1.13M,在另一台上是955K。太奇怪了。
我有2台电脑。都是D6+补丁2+WIN2000 PRO
我在一台机器上做的WebSnap程式,是通过DCOMConnection连接应用程序服务器来获取数据。这些天在Code6421兄指导下,已经搞定。在我的机器上,不单只在WebDataModule.OnCreate里要CoInitialize,还要在OnActive里加这句,否则可能第二次浏览页面就出错了。
根据我用WINDOWS2000的“任务管理器”观察,浏览页面时,应用程序服务器启动起来了,并且拥有7个线程。不停掉APACHE SERVER,应用程序服务器的线称就一直存在。
怪事来了。我把在这台机器上做好的程式的Source Code拷贝到另一台机器上,用另一台机器的D6来Build,结果出来的DLL文件比第一台机器上Create出来的小。第一台机器上Create出来的DLL档大概有1.14M,第二台机器上Create出来的DLL档大小是955K。
然后,在第二台机器上的APACHE里运行这个955K的DLL,浏览页面,居然在多次浏览的时候出错误,提示:没有调用CoInitialize。
然后,用“任务管理器”观察,发现在这台机器上,浏览页面时,应用程序服务器才启动,页面浏览完毕,应用程序服务器就消失掉。第二次刷新页面,应用程序服务器又重新启动。
1-同样的DELPHI来CREATE相同的SORCE CODE,居然CREATE出来的DLL档案大小不同。
2-同样的系统(WIN2000 PRO),居然应用程序服务器的行为不同。
请问是否有系统设定不同的情形造成应用程序服务器的行为不同?从Catche的角度来看,应用程序服务器一直保持在RAM中应该效率更高。
至于DELPHI生成的档案大小不一致,是否是DELPHI的设定有不同?我的两台机器上的D6都是按照安装的默认设定,没有更改过。
上面的怪现象2,根据今天晚上的仔细观察,再第二台电脑上,如果在WebDataModule.OnDeActivate里有CoUnInitialize,会在浏览完页面后,自动将应用程序服务器从RAM中卸掉。
但是,在第一台电脑中也有这一行,却没有把应用程序服务器卸掉。
※ 引述《pcplayer》於 06/02/2002 00:52:19 發表之銘言:
>我有2台电脑。都是D6+补丁2+WIN2000 PRO
>
>我在一台机器上做的WebSnap程式,是通过DCOMConnection连接应用程序服务器来获取数据。这些天在Code6421兄指导下,已经搞定。在我的机器上,不单只在WebDataModule.OnCreate里要CoInitialize,还要在OnActive里加这句,否则可能第二次浏览页面就出错了。
這應該是OnDemand 與OnAlways 的差別,在我的程式中,我是將該Module 設成
OnAlways,也就是說載入時就會啟動Ap Server,直到該DLL 被卸載後才會關閉
AP Server.
至於檔案大小,我不是很清楚,理論上只要一樣是Update Pack 2,而且Compiler/Link
選項一樣的話,大小應該也是一樣的.
你可以查查設定,以及Compiler 的Path,是否有Compiler 到不同DCU/SRC 的情況.
※ 引述《code6421》於 06/02/2002 05:00:09 發表之銘言:
>※ 引述《pcplayer》於 06/02/2002 00:52:19 發表之銘言:
>>我有2台电脑。都是D6+补丁2+WIN2000 PRO
>>
>>我在一台机器上做的WebSnap程式,是通过DCOMConnection连接应用程序服务器来获取数据。这些天在Code6421兄指导下,已经搞定。在我的机器上,不单只在WebDataModule.OnCreate里要CoInitialize,还要在OnActive里加这句,否则可能第二次浏览页面就出错了。
>
>這應該是OnDemand 與OnAlways 的差別,在我的程式中,我是將該Module 設成
>OnAlways,也就是說載入時就會啟動Ap Server,直到該DLL 被卸載後才會關閉
>AP Server.
>
>至於檔案大小,我不是很清楚,理論上只要一樣是Update Pack 2,而且Compiler/Link
>選項一樣的話,大小應該也是一樣的.
>你可以查查設定,以及Compiler 的Path,是否有Compiler 到不同DCU/SRC 的情況.
谢谢Code6421兄。我可以确定,我的WebDataModule都是Always的。经过我的测试,是因为我在WebdataModule的OnDeactivate里写了:DCOMConnection.Connected:=False和CoUnInitialize,导致了App server被关闭。只要去掉这里,APP SERVER就不会被关闭了。但问题是在另一台机器上,同样的程式,也就是在OnDeactivate里同样有那两行,却不会关闭APP SERVER。此为奇怪之处。
上次请教Code6421兄关于File Upload出现的怪事,也是出现在那台不会关闭APP SERVER的机器上的。
※ 引述《pcplayer》於 06/02/2002 12:45:34 發表之銘言:
>※ 引述《code6421》於 06/02/2002 05:00:09 發表之銘言:
>>
>>這應該是OnDemand 與OnAlways 的差別,在我的程式中,我是將該Module 設成
>>OnAlways,也就是說載入時就會啟動Ap Server,直到該DLL 被卸載後才會關閉
>>AP Server.
>>
>>至於檔案大小,我不是很清楚,理論上只要一樣是Update Pack 2,而且Compiler/Link
>>選項一樣的話,大小應該也是一樣的.
>>你可以查查設定,以及Compiler 的Path,是否有Compiler 到不同DCU/SRC 的情況.
>
>谢谢Code6421兄。我可以确定,我的WebDataModule都是Always的。经过我的测试,是因为我在WebdataModule的OnDeactivate里写了:DCOMConnection.Connected:=False和CoUnInitialize,导致了App server被关闭。只要去掉这里,APP SERVER就不会被关闭了。但问题是在另一台机器上,同样的程式,也就是在OnDeactivate里同样有那两行,却不会关闭APP SERVER。此为奇怪之处。
>
>上次请教Code6421兄关于File Upload出现的怪事,也是出现在那台不会关闭APP SERVER的机器上的。
嗯..看來是系統的問題,你可以先查查DCOM Config,如果查不出端倪,
那可能得重新安裝系統了.
另外File Upload 發生死結的問題,記憶中應該已在UP 2 中修正了,
你可以查查Borland Community這篇文章,這是非正式的Bug Fixed.
http://community.borland.com/article/0,1410,28366,00.html
--
just coding....
just home:http://home.pchome.com.tw/guide/code6421
※ 引述《pcplayer》於 05/31/2002 21:23:43 發表之銘言:
>Dr. Bob有篇文章讲到在CGI下,WebSnap中如何管理Session。文章地址:
>http://www.thedelphimagazine.com/samples/1391/1391.htm
>
>其中有段代码:
>procedure THome.SessionsServiceStartSession(ASender: TObject;
>ASession: TAbstractWebSession);
>var
>WebBrokerSessionId: String;
>UserName: String;
>begin
>WebBrokerSessionId := Request.CookieFields.Values['WebBrokerSessionId'];
>if WebBrokerSessionId <> '' then begin
>with TIniFile.Create('_private'+PathDelim+'session.ini') do
>try
>// RETRIEVE USERNAME INFORMATION
>UserName := ReadString(WebBrokerSessionId,'UserName','');
>// ERASE SECTION
>EraseSection(WebBrokerSessionId)
>finally
>UpdateFile; // Needed for Kylix
>Free
>end;
>// FORCE LOGIN AS USERNAME
>if UserName <> '' then
>with Login do
>TLogin(LoginFormAdapter1).ExecuteLogin(UserName) <<-------我的测试中,在Apache下的CGI里执行这句话,就一定返回给IE的是Access violation at XXXX这个错误信息。而在Debug方式下,执行这句就成功,没有错误。
>end
>end;
>
>既然Dr. Bob的文章中这样写,我想他是测试过的。为什么到我这里就出错呢?我的D6做了Pack2的。
這篇文章應該是針對Kylix 2 所寫的,是否在Windows 下測試過就不清楚了,
技術上來說,要在CGI 下保存Session 無非是在OnDeactive 時將Session
整個存回File/Database,你可以參考Borland 網站中的文章,裡面有一小
段使用Database 來保存Session ID 的程式碼,稍加變化應該就能保存Session
了.
(用CGI 保留Session 是很沒效率的動作,但在Linux 下,這是唯一方法.)
PS: 我正在籌劃寫一篇短篇的BizSnap/WebSnap FAQ,或許會加入這方面的
程式碼,但....我想玩電動的慾望多過於寫程式 ^^||
--
just coding....
just home:http://home.pchome.com.tw/guide/code6421
Author Topic
unite
幼幼班
China
40 Posts Posted - 05/30/2002 : 08:50:58
--------------------------------------------------------------------------------
服务器的进程DLLHost会在2-3小时内消耗300多M内存(基本是线性增长),然后CPU占用率会忽然剧增到100%,系统反映迟钝,类似死机,重启IIS服务后,DLLHost进程占用内存数又降为10多M,系统恢复。
我的WebSnap中有20个左右的PageModule和一个DataModule,PageModule设为caDestroy,DataModule为caCache。在PM的OnActive事件中会将DM中相应的Query或Table定位(Locate)到我想操作的记录。另外我在程序中使用了较多的Session,设Timouto为20,Maxsession为50。
请教各位,会是什么原因造成当机的呢?
我使用Session的主要目的是在PM之间传递参数,如果不使用Session,用什么方法?
--
--step by step--
unite
幼幼班
China
40 Posts Posted - 05/31/2002 : 15:50:35
--------------------------------------------------------------------------------
经过长时间观察,发现有一个页面相当奇异,每访问一次,内存就消耗4M左右,此页面和其它页面的实作方法是一样的,唯一不同的是此页面显示了将近200个数据,这些数据是由一个TAdoQuery从18个数据表中读取出来的。对这个Query执行Open操作时,内存就在这时增加了,而执行Close后内存并没有得到释放。
于是试着减少页中的数据,随着数据量的减少,内存消耗速度降低,当数据少到只有从8个数据表中读取的近100个数据时,无论访问此页面多少次,内存维持在一个水平上下波动,不再无限增长了。
于是又怀疑是Ado的问题,将此AdoQuery复制到一个普通的Application,不段执行Open和Close,但不会出现消耗内存的情况。看来不是ADO的问题。
那么是什么问题呢?
--
--step by step--
code6421
大班
Taiwan
380 Posts Posted - 06/03/2002 : 16:45:11
--------------------------------------------------------------------------------
※ 引述《unite》於 05/31/2002 15:50:35 發表之銘言:
>经过长时间观察,发现有一个页面相当奇异,每访问一次,内存就消耗4M左右,此页面和其它页面的实作方法是一样的,唯一不同的是此页面显示了将近200个数据,这些数据是由一个TAdoQuery从18个数据表中读取出来的。对这个Query执行Open操作时,内存就在这时增加了,而执行Close后内存并没有得到释放。
>
>于是试着减少页中的数据,随着数据量的减少,内存消耗速度降低,当数据少到只有从8个数据表中读取的近100个数据时,无论访问此页面多少次,内存维持在一个水平上下波动,不再无限增长了。
>
>于是又怀疑是Ado的问题,将此AdoQuery复制到一个普通的Application,不段执行Open和Close,但不会出现消耗内存的情况。看来不是ADO的问题。
>
>那么是什么问题呢?
如果你開一個新的WebSnap Application,用一個ADOQuery 來測試,
是否一樣會有Memory leak 的問題?
--
just coding....
just home:http://home.pchome.com.tw/guide/code6421
unite
幼幼班
China
40 Posts Posted - 06/04/2002 : 09:43:29
--------------------------------------------------------------------------------
开了一个新的WebSnap Application,只用了一个AdoQuery也会有这种情况,后来无意中发现,这和ADO没有关系,而是和Html中使用的Script数量有关,也就是说,在不改变任何后台数据处理的情况下,不把所有的Field加到AdapterFieldGroup中,减少AdapterDisplayField的数量就能改善这种情况,下表中列出了页面访问次数、页面中Field数量和内存占用情况的数据,在Excel表中可以很清楚地发现其中是有规律的。
+---->(field数量)
|
|
(访问次数)
323f 281f 239f 176f 113f 50f 20f
1 22.076 22.168 20.352 16.916 13.896 12.008 11.704
2 36.404 32.608 28.084 20.936 16.408 12.7 12.86
3 45.316 41.88 35.276 25.548 17.484 13.196 12.72
4 56.664 50.592 41.82 30.156 19.296 12.94 12.764
5 67.568 57.708 48.596 34.9 21.152 13.004 12.884
而且发现如果使用AdapterPageProductor来实作的话,内存增长得更快,而使用自己在PageProductor中定的script增长会慢一点。这两种方法产生的script中唯一的区别是AdapterPageProductor的量更大,因为它包含了一些判断字段是否visable……的script。
脚本解释的问题?
--
--step by step--
Author Topic
pcplayer
大班
China
358 Posts Posted - 06/04/2002 : 20:03:55
--------------------------------------------------------------------------------
Internal Server Error 500
--------------------------------------------------------------------------------
Exception: EOleSysError
Message: 尚未调用 CoInitialize。
---------------------------------------------------
WebSnap+DCOMConnection做的Apache Shared Module,在有DCOMConnection的那个WebDataModule里,按照这几天code6421兄的指点,已经加上了CoInitialize和CoUnInitialize,在我的一台机器上测试正常。在那台机器上Create出来的Dll档有1.15M大小,在那台机器上开一个虚拟机,模拟成2台电脑同时访问,没有问题。
现在把程式码拷贝到另一台机器上,Create的DLL档大小是955K,在这台机器上自己访问也没问题。如果再加多一台电脑对它进行访问,就出现上面的错误提示。
请教,这个问题是程式还需要改进,还是系统的问题?2台机器都是WIN2000 PRO
code6421
大班
Taiwan
380 Posts Posted - 06/05/2002 : 11:28:53
--------------------------------------------------------------------------------
※ 引述《pcplayer》於 06/04/2002 20:03:55 發表之銘言:
>Internal Server Error 500
>
>--------------------------------------------------------------------------------
>Exception: EOleSysError
>Message: 尚未调用 CoInitialize。
>---------------------------------------------------
>
>WebSnap+DCOMConnection做的Apache Shared Module,在有DCOMConnection的那个WebDataModule里,按照这几天code6421兄的指点,已经加上了CoInitialize和CoUnInitialize,在我的一台机器上测试正常。在那台机器上Create出来的Dll档有1.15M大小,在那台机器上开一个虚拟机,模拟成2台电脑同时访问,没有问题。
>
>现在把程式码拷贝到另一台机器上,Create的DLL档大小是955K,在这台机器上自
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -