做到pooler后﹐連接客 戶 端 出 現 的 問 題 ﹗各高手請一定要留步﹗(200分)

  • 主题发起人 主题发起人 liuxiangsoft
  • 开始时间 开始时间
L

liuxiangsoft

Unregistered / Unconfirmed
GUEST, unregistred user!
我在dfw上看了好多的貼子﹐也找了好多資料﹐因為我想做好一個pooler﹐
在網友的熱心幫助下﹐最終完成了服務端的編譯成功﹐但是﹐接下的問題又來了。我
在客戶端用socketsconnect進行連接成功后﹐(設置服務器是 ﹕ server.pooler).照說
應該是可以算一段落了﹐但是新的問題又出現了﹐就是我在客戶端的clientdataset的設置。
我先設為無狀態﹐將fetchondemane設為falst﹐再改packetrecord為10﹐設置remoteserver為剛才添加的socketconnect.但是這里的providername下拉沒有內容﹗

于是我又再回來看delphi的demo同﹐結果我發現在這里我下拉后有內容﹐但是在屬性框里一點clientdataset的active為true時﹐報錯﹕

數據庫發生災難性故障﹗

請各位朋友幫我解決一下﹐
chinalx8028@163.com
 
数据库发生灾难性故障是中间层连接数据库出错了,异常被抛到了客户端啊。
你需要在服务器上进行调试,确定出错的原因。
 
但是為什么﹖我要么連接池成功后﹐clientdataset的remoteserver設為socketconnect﹐可是providername的下拉卻為空﹖

也就是說﹐這個pooler﹐并沒有產生效果﹗
 
關于池的連接﹐我現在還不了解﹐但是對于julian2082和proman這兩位朋友的熱心幫助﹐

我只有各分100分﹐還清笑納﹗

雖此貼已結﹐但還請你們繼續關注這個問題﹗

http://www.delphibbs.com/delphibbs/dispq.asp?lid=2558768
 
在我的三层里,根本就没有用Provider,所以呵呵
不过我想SockerConnection比较重要的是GUID吧。ServerName不重要。
 
你不用provider﹐那又是怎樣寫的﹖
能不能再講一下你的方法﹖
 
我的qq﹕
32737562
msn﹕lxsoft@hotmail.com
chinalx8028@163.com
 
我觉得你连接POOL成功是没错,但POOL上没有PROVIDER组件,它只是提供连向远程模块的接口,所以下拉框没东西。但并不是说POOL没效果,其实你在点击下拉框的同时已经激活了POOL,这点你可以在POOLMANAGER的CREATE事件中加入SHOWMESSAGE语句加以验证,你应该会看到弹出的对话框。因此,你在框里自己写相应的PROVIDERNAME就可以了,如果不行,应该是其他方面的错误吧。

另外,看你贴出的代码,有点不明白,为什么要再创建连接?还有,你的代码似乎只是创建了数据库连接的池,而不包括其他资源和借口方法,好象CLIENTDATASET激活之后会调用远程模块中“AS_”开头的一些方法(哪些偶不记得了^_^!...)以获得PROVIDER所连接的数据源中的数据,所以,会不会有和你遇到的问题有点点关系呢?^_^
 
另外,请教一下proman一个问题

实现多线程的模式,是不是应该把进入COM线程模型的代码写在客户端?写在即将调用远程方法之前呢?
 
julian2082!
很感謝你的幫助﹐我現在正同proman在msn上交流。同時也學到不少新的東西。
我的qq﹕32737562
msn﹕lxsoft@hotmail.coom
E_mail:chinalx8028@163.com

對于池﹐我也搞好不少于100次實驗﹐因為我現在有80個用戶﹐我想到用pooler。但是我不會﹗出現的問題是千奇百怪的。我用的是繁體﹐我給你發我的程序﹐你幫我看看好嗎﹖
 
我的email:one_zhu@sohu.com
 
julian2082!
用pooler是不是不能一開始就創建adoconnection的連接呢﹖proman也這樣說我﹐看到﹐我這里是做錯了﹐我在遠程數據模塊內加入的是﹕aodconnection,adoquery,datasetprovider.我的連接池的代碼是參照你的寫的﹐我的客戶端想用socketconnection和datasetclient進行取數據﹐

現在問題是﹕我有80個用戶﹐以前的mrp是用vfp寫的﹐有時30個同時上線﹐1024m內存的服 務器就快出現死機的現象﹐所以我想用delphi改寫﹐但 是在網上看也有可能是一樣的效果﹐但是用到pooler﹐可能會緩解這個現象﹐如是我就想到pooler﹐可是我從未做過pooler。只能看delphi的demo﹐還是搞不明白﹐有人說那個是bde的﹐不是ado的﹐但是我不懂那個是什么﹖現在我對pooler的概念是很清楚﹐可是我不會用代碼來實現﹐又沒有例子﹐只想看到一個例子就好﹐在www.china-pub.com上只要看到上涉及pool的書我就下訂單﹐今天又買了200多塊的書了﹐不知有沒有效果﹗

Julian2082:如果你有這方面的例子﹐可不可以給我看看﹖
 
实现多线程的模式,是不是应该把进入COM线程模型的代码写在客户端?写在即将调用远程方法之前呢?
实现多线程模式主要是服务器的问题,同客户端关系不大。
主要是你创建Com对象的方式,但要注意多线程的冲突问题。
 
TO PROMAN
你的意思是不是说在创建远程模块的时候使用APRATMENT,和MULITINSTANCE 就可以了呢?

最近看到了这样的代码,看起来是在客护端实现了多线程,是不是按他的做法就可以在服务器端再建立一个独立的APARTMENT线程,实现所谓的多线程呢?有点困惑,望能指教!
---------------------------------------
在Midas客户端用线程读取数据包
unit unit1;

interface

uses
windows, messages, sysutils, variants, classes, graphics, controls, forms,
dialogs, db, dbclient, mconnect, stdctrls, grids, dbgrids,comobj,activex
,provider,midas;

type
topenthread = class(tthread)
private
fcds: tclientdataset;
fstream: pointer;
fnewdata:olevariant;
protected
procedure execute; override;
procedure updatecds;
public
constructor create(cds: tclientdataset);
end;

tform1 = class(tform)
dcomconnection1: tdcomconnection;
clientdataset1: tclientdataset;
datasource1: tdatasource;
dbgrid1: tdbgrid;
button1: tbutton;
procedure button1click(sender: tobject);
private
{ private declarations }
public
{ public declarations }
end;

var
form1: tform1;

implementation

{$r *.dfm}

{ topenthread }


constructor topenthread.create(cds: tclientdataset);
begin
freeonterminate := true;
fcds := cds;
olecheck(comarshalinterthreadinterfaceinstream(
iid_iappserver,
fcds.appserver,
istream(fstream)));
inherited create(false);
end;

procedure topenthread.execute;
var
ownerdata: olevariant;
recsout: integer;
params:olevariant;
appserver:iappserver;
begin
olecheck(coinitialize(nil));
try
olecheck(cogetinterfaceandreleasestream(istream(fstream), iid_iappserver,
appserver));
fnewdata :=
appserver.as_getrecords (fcds.providername,
-1,recsout,metadataoption,'',params,ownerdata);
synchronize(updatecds);
finally
couninitialize;
end;
end;

procedure topenthread.updatecds;
begin
fcds.appenddata(fnewdata,true);
form1.datasource1.dataset:=fcds;
end;

procedure tform1.button1click(sender: tobject);
begin
topenthread.create(clientdataset1);
end;

end.
 
怎么用别人的地方提问啊?
服务器端的线程模式是COM对象的线程模型
客户端的线程是客户端的线程和服务端完全没有关系。各是各的用处。
 
to Julian2082,Proman:

本來我想結貼﹐但是現在你們談到線程﹐那我就繼續保留3天﹐
分數﹕
Proman:150,
Julian2082:50,

你們都是我的良師益友﹐希望大家以后多多幫助﹐多多聯系﹗
 
呵呵,不好意思借宝地一用^_^!...

但上面的代码中似乎也涉及到了进入COM线程模式的内容,他们有什么区别呢?

希望能指教,谢谢!
请进 http://www.delphibbs.com/delphibbs/dispq.asp?lid=2572618
 
liuxiangsoft,你好
你的POOL做成功了吗?
我想请教你一问题,你是怎么实现把POOL里面建立的connction交给远程模块使用的?我有点不明白,能告诉我吗?谢谢
 
多人接受答案了。
 
后退
顶部