最近打算用MTS来作三层结构中的应用服务器。 (300分)

  • 主题发起人 主题发起人 程云
  • 开始时间 开始时间
确实,我觉得mts应该不是真正的多线程,当mts服务器被调用时的现象不知如何解释
 
听课,学习,记笔记
 
>>3、[blue]MTS对象的接口函数的参数据类型问题。[/blue]
>> 想通过COM对象的接口函数的参数传递几种特殊类型的参数,如:记录类型、Delphi对象。
>> 不知是否可以胜任?如何去作的?
我是通过Stream和OleVariant的转换传递传递的。
先把自定义记录类型读到Stream,再转成OleVariant,传递到另一方后,OleVariant转换
成Stream,再读出记录。对象也可以这样。
用惯了,也没有再去找其他简单方法!
procedure VariantToStream(const Data: OleVariant;
Stream: TStream);
var
p: Pointer;
begin
p := VarArrayLock(Data);
try
Stream.Write(p^, VarArrayHighBound(Data,1) + 1);
//assuming low bound = 0
finally
VarArrayUnlock(Data);
end;
end;

function StreamToVariant(Stream: TStream): OleVariant;
var
p: Pointer;
begin
Result := VarArrayCreate([0, Stream.Size - 1], varByte);
p := VarArrayLock(Result);
try
Stream.Position := 0;
//start from begin
ning of stream
Stream.Read(p^, Stream.Size);
finally
VarArrayUnlock(Result);
end;
end;

 
我也正想知道答案
 
请大家继续讨论。
 
程大虾怎么不出来说说话!光发帖子,不出来讨论,搞得都没劲了!
强烈要求程云大虾出来谈谈自己对上述四个问题的想法。
也希望其他大虾小虾们都来讨论!!!!!!!
 
各位老兄们
最近公司的网络出了点问题
近期是上不了网了
:-(
还请多多原谅
 
程云:
第四个用webservice/Soap正好解决。
 
[blue]1、MTS的对象缓冲问题。[/blue]
MTS(该叫COM+)的对象缓存是由COM+进行管理的,组件本身有个引用计数,如果被引用
一次则加1,如果一个引用结束则减1,如果计数器减到0,操作系统就会释放这个组件所
占的资源,下回要调用这个组件就需要从磁盘上重新load了。而COM+的对象池截获了这个
计数为0时的释放动作,使得组件并没有被释放。等待下次被调用时免去从磁盘load的过
程,对于整个系统的性能有很大的帮助。[red]要使组件能够被对象池管理,首先组件的线程
模型是free,不能是apartment,其次必须是进程内组件,即DLL形式的,而不能是EXE的,
再有组件必须是线程安全的。[/red]
 
1、MTS的对象缓冲问题。
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/mts/mtxpg04_8v6v.asp
2、MTS对象的线程模式问题。
线程模式:Free--可以Object Pooling
。。。
3、MTS对象的接口函数的参数据类型问题。
没有做不到,只有想不到。。
TypeLibrary进行记录和oleVariant之间的转化
4、远程MTS对象访问问题。
别人的现成回答
六、 以TSocketConnection作为客户端应用程序
该种方式使用于局域网和广域网内的通信,但是不能绕过防火墙。
该种方式还需要首先运行服务器端的socket server程序scktsrvr.exe以用于监听连接。
步骤一、建立新项目。
步骤二、加入TSocketConnection组件,设置其address属性为服务器的ip地址,ServerName属性为应用服务器server名,然后置Connected属性为true。
步骤三、加入TclientDataSet组件、DataSource组件、及DataControl中的组件。其中TclientDataSet重点设置的属性为:RemoteServer和ProviderName。
步骤四、进一步完善程序,保存并编译程序。
七、 以TwebConnetion作为客户端应用程序
该种方式使用于局域网和广域网内的通信,且能绕过防火墙。
这种方式要求将httpsrvr.dll文件复制到指定的网页服务器目录中,且设置该目录属性为可执行权限。另外客户端计算机中必须安装wininet.dll文件
步骤一、建立新项目。
步骤二、加入TwebConnetion组件,设置其url属性为服务器的url地址,ServerName属性为应用服务器server名,然后置Connected属性为true。
步骤三、加入TclientDataSet组件、DataSource组件、及DataControl中的组件。其中TclientDataSet重点设置的属性为:RemoteServer和ProviderName。
步骤四、进一步完善程序,保存并编译程序。
 
1、[blue]MTS的对象缓冲问题。[/blue]
MTS对象的缓冲是自己控制的
如是由程序员自己来作,该如何来作?
如是MTS自动完成,用Pooling去控制
2、[blue]MTS对象的线程模式问题。[/blue]
看房客
3、[blue]MTS对象的接口函数的参数据类型问题。[/blue]
问题太泛
4、[blue]远程MTS对象访问问题。[/blue]
Socket或SOAP
 
[blue]MTS对象的线程模式问题。[/blue]
可以说已达成共识,这的确没有问题,看来李维是用的自动化对象,与我们所用有异。
[blue]MTS的对象缓冲问题。[/blue]
因为在很多书上都说MTS不支持Pooling。我也有点糊涂,不过好象问题也不大,也先不谈它了。
[blue]MTS对象的接口函数的参数据类型问题。[/blue]
主要是对数组类型,结构类型,和对象作为应用服务器接口函数的参数。
我现在直都在用与GanQuan老兄类似的方法,不过,不太好用呀。
[blue]远程MTS对象访问问题。[/blue]
有空试试“房客”的方法了,这里先谢过了。
我现在一直是使用Socket来与远程应用服务器相联来传输数据,
因为这种方式可以作数据拦截者的插件进去,用它与用中间数据包的加密与解密。
同时也可对传输的数据进行压缩解压处理。

 
>>因为在很多书上都说MTS不支持Pooling。我也有点糊涂,不过好象问题也不大,也先不谈它了。
好像很多书上是这样说,不过COM+已经支持Object Pooling了。
可以指定COM+对象使用完毕后是否释放。
 
>>>>因为在很多书上都说MTS不支持Pooling。我也有点糊涂,不过好象问题也不大,也先不谈它了。
>>好像很多书上是这样说,不过COM+已经支持Object Pooling了。
但是好多书上说这个pooling是假的(d5中),没有用,可是我却找不到地方设!!
据说是一个属性:CanBePooling(??不懂对不对)//出自《delphi5彻底剖析》(呀呀,这个
书名也是隐约记得的)
 
我在这问一个问题:MTS到底是什么?
 
听一下,多学点!没时间了,要上班了!
 
后退
顶部