有关DELPHI 6.0 开发的三层的严重系统问题。

关于Delphi6.0开发的三层服务器掉线的问题 开发运行环境: 1. 数据库服务器采用ORACLE9i,硬件配置绝对能撑! 2. 应用服务器端采用Delphi6.0开发,TypeLibrary来实现IDL接口,采用TcorbaDataModule(88个模块)结合TAdoDataSet进行数据处理,该应用层服务器使用的硬件为SUN服务器,多CPU,WIN2K SERVER操作平台; 3. 客户端采用Delphi6.0开发,TClientDateSet与之对应相连,WIN2K PRO 操作平台; 4. 中间件采用Delphi6.0自带的VisiBroker3.3; 5. 78台客户端,两台SUN服务器。 掉线现象: 1. 一般使用一个星期(操作不是很频繁)就会掉一次线,将服务器端启动的所有服务器端进程杀掉,然后客户端启动,服务器端通过VisiBroker3.3 OAD自动重新启动,一般会启动多个进程,然后就没有问题,系统运行就正常!严重的还必须重新启动一下服务器端机器才可以。 2. 使用的SUN服务器是多CPU的,在多CPU环境下掉线异常频繁,每几个小时会掉一次,因此,现在只留一个CPU在机器里。 情况分析: 1. Delphi6.0自带的VisiBroker3.3是自带工具,只能用于开发而不适合实际商业应用,要投入实际商业应用必须购买企业版的中间件。如果只用于开发而不能做为商业应用,是不是意味着Delphi6.0不能做三层?我可以这么理解吗?(商业化的VisiBroker据说是个天价,客户肯定不会因为我们的软件而自配一套企业版的VisiBroker) 2. 应用服务器端接口存在问题,这只能是一种猜测,究竟是什么问题?采用的是Delphi6.0的TypeLibrary生成的接口,在这个接口下进行应用服务器开发还有什么规范吗?应该跟开发C/S是一个道理。(如果是这个原因我该如何规范代码呢?) 3. 多CPU掉线频繁肯定是跟底层代码有关!但究竟是自带的VisiBroker3.3还是TypeLibrary又或者是TAdoDataSet的问题?其实我更希望是自己写的服务器的问题,可是我想这种可能性应该是最小吧?做数据库开发,底层或者说系统层的都是由控件完成的,我们写的代码只是一些SQL和一些业务控制。(该如何控制内部的CPU分配?服务器端一个应用程序,也就是说一个进程,每一个客户端连接的一个进程,体现在服务器进程里的是一个线程操作,是否是客户端一旦不操作如何快速释放该连接的线程的问题,然后客户端暂时与服务器端断开,服务器端与数据库的相关连接也自动释放,一旦客户操作,就默认重连一下服务器,这样客户端操作感觉不到是掉过线的,这样该如何处理?我看到客户断即使全部断开,应用服务器与数据库服务器断的连接几乎完全没有释放掉,这又是什么原因,是否ADO连接本身就是有问题呢?) 需要解决的问题: 1. SUN服务器的其他CPU如何才能安装到机器上?究竟Delphi 6.0自带的CORBA能否支持多CPU? 2. 一个星期一次的掉线,太夸张了吧?一个月还可以接受! 显然,我认为以上的情况分析过于片面,而且即使能确定是上面的原因,也没有切实可行的解决方案,希望大家能帮助我想想办法,如果需要源码,我可以贴出一部分来,大家帮我研究研究,有相关资料的请发到我的邮箱:LiuFuSh@hotmail.com。
一个使用ADO连接池的示例,演示了TADOStoredProc动态参数的使用,带重连机制 =================== unit UnitDemo; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm2 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form2: TForm2; //数据库服务器 gDBServer: String = '127.0.0.1'; //数据库名称 gDBName: String = 'master'; //数据库用户名 gDBUser: String = 'sa'; //密码 gDBPass: String = '2001'; implementation {$R *.dfm} uses ADODB, UnitADOConnectionPool; const CreateSQL = 'create procedure TestMyPool (@type sysname) '#13#10+ 'as'#13#10+ 'select * from sysobjects where xtype=@type'#13#10+ 'return @@rowcount'; DeleteSQL = 'if Exists(select 1 from sysobjects where xtype=N''P'' and name=N''TestMyPool'')'#13#10+ ' drop procedure TestMyPool'; var gPoolMan: TADOConnPoolMan = Nil; procedure TForm2.Button1Click(Sender: TObject); var ADOObject:TADOConnPoolObject; ADOStoredProc:TADOStoredProc; Running :Integer; I: Integer; begin //取得一个存储过程资源(含一数据库有效连接) ADOObject := gPoolMan.CreateSP('TestMyPool'); if ADOObject = Nil then //取得资源失败 Exit; try ADOStoredProc := ADOObject.ExecObject as TADOStoredProc; Running := 2;//允许重试(两次)操作,以便在操作失败之后达到重连 while Running>0 do begin Dec(Running); if ADOObject.NeedRefresh then begin//判断是否有重连标志(比如数据库断开等,可能需要进行重连) if Not ADOObject.Reconnect then Exit; ADOObject.NeedRefresh := Not ADOStoredProc.Parameters.Refresh; if ADOObject.NeedRefresh then Exit; end; for I := 1(*Zero is the *Result* Parameter*) to ADOStoredProc.Parameters.Count - 1 do begin //========================= //传递参数 ADOStoredProc.Parameters.Items[I].Value := 'U'; //========================= end; if Running 0 then try //执行存储过程 ADOStoredProc.Open; //执行存储过程成功,退出循环进入后续的数据处理 break; except On E:Exception do begin //执行失败非程序级的异常通常有两种可能: //1.数据库连接断开 //2.自适合的参数传递当中可能存储过程已更新,参与不一致 //设置重连标志 ADOObject.NeedRefresh := True; //=================== //这里记录数据库操作失败日志 //=================== end; end; Exit; end; //========================== //从ADOStoredProc当中读取记录 ShowMessage(IntToStr(ADOStoredProc.Parameters.ParamByName('Result').Value)); //========================== //关闭存储对象的资源 ADOStoredProc.Close; finally //调用结束,释放资源 ADOObject.Free; end; end; procedure TForm2.FormCreate(Sender: TObject); var ADOConn:TADOConnection; begin (****************BEGIN*******************) (*注:仅为测试准备 *) //初始化测试环境 ADOConn := Nil; if Not TADOConnPoolMan.ConnectADO( gDBServer,gDBUser,gDBPass,gDBName,true,ADOConn) then Exit; try ADOConn.Execute(DeleteSQL); ADOConn.Execute(CreateSQL); finally try ADOConn.Close; except end; ADOConn.Free; end; (*****************END********************) //初始化连接池 gPoolMan := TADOConnPoolMan.Create(gDBServer,gDBUser,gDBPass,gDBName,true); end; procedure TForm2.FormDestroy(Sender: TObject); var ADOConn:TADOConnection; begin //释放连接池 if Assigned(gPoolMan) then gPoolMan.Free; (****************BEGIN*******************) (*注:仅为测试准备 *) //清理测试环境 ADOConn := Nil; if Not TADOConnPoolMan.ConnectADO( gDBServer,gDBUser,gDBPass,gDBName,true,ADOConn) then Exit; try ADOConn.Execute(DeleteSQL); finally try ADOConn.Close; except end; ADOConn.Free; end; (*****************END********************) end; end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值