三层结构中的疑问,请大侠给讲一下我的理解对不。 (50分)

  • 主题发起人 主题发起人 sward
  • 开始时间 开始时间
S

sward

Unregistered / Unconfirmed
GUEST, unregistred user!
在三层结构中,我在应用服务器的远程数据模块上写的方法(比如为终端用户提供一个按申请顺序的顺序号)
在实际运行中是排队模式呢还是多线程模式?
换句话说,多个用户通过这个接口做的操作是不是不可能同时操作?
(我知道那些数据集是多线路模式)
 
unit server_data;
interface
uses
Windows, Messages, SysUtils, Classes, ComServ, ComObj, VCLCom, DataBkr,
DBClient, wzserver_TLB, StdVcl, IBQuery, IBDatabase, Db, IBCustomDataSet,
IBTable, Provider, DBTables;
type
Twz_server_data = class(TRemoteDataModule, Iwz_server_data)
PQ_user: TDataSetProvider;
PQ_COM1: TDataSetProvider;
...
PQ_COM2: TDataSetProvider;
PT_exe: TDataSetProvider;
private
{ Private declarations }
procedure ReOutFiFo(BranchNo:String);
procedure ReSumBranch(BranchNo:String);
procedure ReSumAll ;
protected
class procedure UpdateRegistry(Register: Boolean;
const ClassID, ProgID: string);
override;
procedure serverqueryopen(sqlstring: OleVariant);
safecall;
function serveraction(actionno, actiontext: OleVariant): OleVariant;
safecall;
public
{ Public declarations }
end;
var sendaction:string;
implementation
{$R *.DFM}
class procedure Twz_server_data.UpdateRegistry(Register: Boolean;
const ClassID, ProgID: string);
begin
if Register then
begin
inherited UpdateRegistry(Register, ClassID, ProgID);
EnableSocketTransport(ClassID);
EnableWebTransport(ClassID);
end else
begin
DisableSocketTransport(ClassID);
DisableWebTransport(ClassID);
inherited UpdateRegistry(Register, ClassID, ProgID);
end;
end;

procedure Twz_server_data.serverqueryopen(sqlstring: OleVariant);
begin
with serverquery1do
begin
close;
sql.clear;
sql.add(sqlstring);
try
execsql;
except
sendaction:=sendaction+' // '+sql.text;
end;
end;
//sendactiob:=sendaction+' // '+vartostr(sqlstring));
end;

function Twz_server_data.serveraction(actionno,
actiontext: OleVariant): OleVariant;
var strno,strtext:string;
begin
.....
end;

procedure Twz_server_data.ReSumAll;
//重新合计库存
begin
....
end;


//重新统计branchno 分公司库存
procedure Twz_server_data.ReSumBranch(Branchno:string);
begin
...
end;



//branchno 分公司 按先进先出法重新出仓
procedure Twz_server_data.ReOutFIFO(BranchNo:string);
var lastcodeid :string;
pjdj,editsl,editje :real;
lastsl,lastje :real;
begin
...
end;

initialization
TComponentFactory.Create(ComServer, Twz_server_data,
Class_wz_server_data, ciMultiInstance, tmApartment);
end.
 
..
有没有人用 D5+INTERBASE+MIDAS的应用系统例子,我把我的分全送出去也要换一个回来学学
 
>>多个用户通过这个接口做的操作是不是不可能同时操作?
是同时操作的。其实就是一个远程数据模块为一个客户端服务
 
每连接上来一个客户端就会生成一个远程数据模块的实例为之服务,你写个测试程序看看就知道了。
 
这个问题似乎和我那个差不多,要不你先看看我得问题?
 
>>多个用户通过这个接口做的操作是不是不可能同时操作?
取資料可以, 更新資料會自動排隊
 
一般情况下都可以,除非你使用了Single Thread 线程模式
 
我在程序中是用一个其它单元中的公用变量 来传调出调试信息的。
sendaction:=sendaction+' // '+sql.text;
如果跟DELPHI自己的例子一样去改动主窗口上的VCL控件,则退出时肯定会报错。
因为调用方是一从一个非主要线程里改动主线程里的可视控件,我查了论坛上的旧贴子
都说不能动这些VCL。当时就想到了用一个变量来传递,在主窗口里定时检查变量
取走后将它截为空字串,这时的确很少退出时报错了,但有时还会有。我看了刘艺的关于线程的书后觉得自己没做同步,应在修改前执行什么命令才合适呢?
 
放心吧,它是多线程的,你写个程序试试就知道了,但不可以在Constructor Create 里访问VCL,否则出错!!! 我正在写三层,有什么问题可以QQ我.
 
>>比如为终端用户提供一个按申请顺序的顺序号
这种办法不好,因为各个终端用户与远程数据模块之间的通讯是并发的,还是放在数据库中吧
 
to aleyn
----------------------
你的QQ是?

哈哈,我的已经写‘完’了。
开始写时就把应用服务器当成一个数据转发站来用除了一堆DS就是DP。
在终端则大量使用commandtext来直接写SQL语句。
后来才发现这样好象不太对,真正的三层可能要想象是由两个人来写就比较正确了
写终端的那个人对数据库中有什么数据很清楚但不知道具体表名和相互结构。
他看到的只能是他申请得来的DS和变量数据(这些全是应用层根据他的申请喂给他的)
我是不是又从一个极端走到了另一个极端?
 
刘艺大侠也在大富翁了, 他的ID是newdream, 你可以邀请他过来看看这个问题啊.
 
to wfzha
-----------
我知道是申请是并发的,我事实上也是用一个数据库里表的一行记录来存储这个当前值的。
如果远程模块上我自己建的方法在读写同一个数据库表时是排队的,我这种方法就没问题
否则就要做一个同步的处理,那正是我担心的
 
让数据库自己做就行了。
 
To sward:
---------
如果你的中间层所有的TABLE都属於同一个DATABASE时,你的CONNECTION连接可以放在MAINFORM里,这样中间层的速度会快很多,而且,会少占用内存,如果不同DATABASE就不可以了,但无伦是不是同一个CONNECTION,如果你用"事务"来写,会避开一个冲突.(但按上面同一个CONNECTION的方法,在客户端同时写时,可能会出现 Connection.InTranstion . 还有其它很多很多实际应用上的问题,待续......................
 
多人接受答案了。
 
后退
顶部