如何实现中间层提供接口,远程访问?(不用COM+做,中间层就用delphi编译的exe程序提供接口来远程访问) ( 积分: 100 )

  • 主题发起人 主题发起人 赛特
  • 开始时间 开始时间
说实话,我现在也正在为这类问题所困扰。
能连接多少台机器同数据库的连接数有关,好像一般的标准版是25个连接以下,25个以上连接的数据库需要很多钱,一般中小企业很难承受。

其实在设计合理的多层分布式系统中,如果采用数据库连接池,25个连接可以连接数百台机器,因为这数百台机器共享25个连接。不过要制作这样的系统,对程序的作者的要求实在是太高了,诚实的说,我今天还没实现。今天晚上我会先写一个连接池做测试。
采用数据库连接池后,分布式系统的层次结构将会有很大的改变。是变化很大很大,反正是超出了我原来的想像。
 
1.DCOM
2.InHttpServer + WebService
3.RemObject
 
to wr960204:
DCOM 没有最大负荷问题吗?
 
今晚做好了ADO + SQL server 2000 + COM+连接池。
测试:
在本机上打开了60个客户端,随机选择60个客户端中的任意一个,测试都可以完成相应客户端的全部功能。测试通过!
而我明白的知道,因为我自己在本机上无论如何也无法做到任一时刻“同时”用到2个客户端数据库连接,因为每次同数据库连接并返回数据只用0.0x秒时间,并且因为用了数据库连接池,事实上,这60个客户端只共享了1个连接好的数据库连接,也就是说:比如我设置了连接池的最大连接数为15个,我现在打开的这60个客户端只用到了数据库连接池的十五分之一!
数据库连接池真是很强大!!
 
恭喜!
问个基础问题:
比如在remote data module中定义了N个供客户端用Socketconnection1.AppServer.DoSth()方式调用的函数,如果这N个函数都需要使用adoquery访问数据库,是不是这N个函数的adoquery要各用各的?因为我觉得当多个客户端同时访问时会有冲突,是不是这样?
 
>>其实我就需要在整个系统中统一系统时间,我的想法就是要在中间层获取系统时间,该用什么方式实现嘛??
如果只是为了统一时间的话,没有必要搞的这么复杂的,如果都可以连接上Internet,直接可以在注册表
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Run
加入你的 net time ...... 命令
这样在系统启动的时候就会自动设置一下时间
要写在delphi程序里面,那么
WinExec( 'net time .......' ,SW_HIDE);
接下来介绍下net time
使计算机的时钟与另一个计算机或域的时钟同步。如果在没有 /set 选项的情况下使用,则显示另一个计算机或域的时间。
net time [//computername | /domain[:domainname] | /rtsdomain[:domainname]] [/set]
net time [//computername] [/querysntp] | [/setsntp[:ntp server list]]
参数

显示被指派为本地计算机的 Windows 服务器域的时间服务器的计算机的当前时间。
//computername
指定要检查或与之同步的服务器的名称。
/domain[:domainname]
指定要同步时间的域。
/rtsdomain[:domainname]
指定要与之同步的可信时间服务器所在的域。
/set
使计算机的时钟与指定的计算机或域的时间同步。
/querysntp
显示当前为本地计算机或 //computername 所指定的计算机配置的网络时间协议 (NTP) 服务器的名称。
/setsntp[:ntp server list]
指定本地计算机所使用的 NTP 时间服务器的列表。该列表可以包含 IP 地址 或 DNS 名称,用空格分开。如果要使用多个时间服务器,该列表必须用引号引起来。
 
“比如在remote data module中定义了N个供客户端用Socketconnection1.AppServer.DoSth()方式调用的函数,如果这N个函数都需要使用adoquery访问数据库,是不是这N个函数的adoquery要各用各的?因为我觉得当多个客户端同时访问时会有冲突,是不是这样?”
只用一个adoquery和DataSetProvader!
我们是通过代理访问的连接池。代理是多实例,多线程的,可同时満足多个客户端使用(比如几百个或上千个客户端)。
 
建议你好好看一下Pooler示例,把它彻底搞懂,另外再学习一下COM基础知识。
如果你花时间后真正看懂了Pooler示例,你的多层分布式系统的结构也就可以确定下来了,因为把Pooler示例搞通了之后,多层分布系统的框架也就自然的浮出水面。
 
在连接池中的一个数据库连接根据数据量可以供50~60客户端调用,甚至更多! 25个连接你想可以满足多少客户端同时调用???如果数据库的可用连接是200个,300个...或是500个,那会是.....不敢想像!!!!
由于每个客户端都是使用已存在的并已连接好的数据库连接,所以速度会非常快!
好了,关于数据库连接池的相关问题,回答到此结束。我不会再为此回答问题。
最后,我只想对大家说的是:COM+SQL Server 2000数据库连接池完全、肯定可以实现!因为我本人已经实现了出来,效果非常好。
 
to gencheng:
确实不错,但有一个问题,所有客户端都关了,只运行了一个server时,数据库连接量还是1,所以在关server时,系统总会问是否强关。要把server也关了,数据库连接才显示0。
注释说有2个地方不同,是否就是说的:
1、本身hiden了
2、多了一个pooler的类
呢?
而且
RDMFactory := TComponentFactory.Create(ComServer, TMyRDM,
Class_MyRDM, ciInternal, tmApartment);
我觉得ciInternal处用ciMultiInstance也可以,因为客户端DCOM在DCOMConnection1.ServerName连接时,本身都是连的pooler,而不是原来那个RDM了。我也测试了,就用ciMultiInstance时,从数据库连接量来看,没区别,还是共享的连接。
 
你还是没完全理解Pooler,Borland的这个示例写的完全正确,不是可以随便改的。
Borland的人当然也不是随便写的这个示例,你那样改当然也可以运行,但pooler就没有意义了。
好好想想...
 
我是从数据库连接量来看,ciMultiInstance时也是共享连接的。能说下有哪里不同吗?为什么从效果来看,是一样的呢?
而且,还有一个问题,用连接池后,再用DCOMConnection1.appserver.do的方式时我试了很久始终不成功,说“灾难性故障”?我之所以要用DCOMConnection1.appserver.do方法,是因为用它来调用存储过程,主要是要实现数据库锁定的修改,并发控制。
 
>>其实我就需要在整个系统中统一系统时间,我的想法就是要在中间层获取系统时间,该用什么方式实现嘛??
中间层:
SystemTime:=FormatDateTime(YYYY-MM-DD HH:NN:SS',Now);
客户端
AppServer.GetSystemTime
中间层如何负荷更多的客户端数量,多台中间层服务器,负载均衡,无状态方式
socketserver的健壮性不好,你可以自己重写一个.
 
“socketserver的健壮性不好”
再不好100个客户以内如何呢?我的需求也就100个以内了!
pooler后,用SocketConnection连接不起了?
 
100个连接对于pooling来说简直就是小菜。如果只是100以内连接,我甚至都不用考虑用pooling。。。。
跳出socketserver或DCOM这个圈子,你才能看的更远,更开阔。
 
存储过程,Table,Query,ClientDataSet它们从本质上来说都是DataSet,本质上并没有什么区别。
如果不清楚可以看一下相关的源码。
 
To gencheng:
我试着把pooler例子中的DCOMConection 直接换成 SocketConnection 其它完全没变,都不能执行成功。
1、把 DCOMConnection 的 ServerGUID 写到 Socketconnection 的 ServerGUID 里面;
2、把 DCOMConnection 的 ServerName 写到 Socketconnection 的 ServerName 里面;
3、SocketConnection 的 Host 写的 127.0.0.1(就在本机测试)
它包错说“Object not available:{GUID串}”。我也看到例子中是说明了pooler的RDM是没有在注册表里注册。我觉得可能是这个原因才报错说GUID不能用。那要如何才能用SocketConnection连接Pooler呢?因为我确实不想用DCOM,配制权限搞了很久,一直都没远程访问成功过,而SocketConnection可以不用配制就连接呀,这下又不能连pooler了!
能说具体点吗,非常感谢!或者直接留个 QQ 可以吗?非常急切啊!!!!
 
用SocketConnection是可以实现这个功能的。
但是必须注意:
1.你必须知道远端服务器的IP地址,当然动态的也可以,必须要有一个地址
2.如果你的服务器已经安装防火墙就必须设定端口为你需要的TCP/UCP端口 如:211
3.在你的IE中也要设定端口为远端服务器端口就可以。
本人已经做过可以使用。
 
后退
顶部