C/S多层数据服务器题

yiyu 2000-08-13 08:39:00
我是刚学Delphi的,现在用它来开发一个三层C/S数据库服务器的程序,可是我碰到当连接多个Client时,Server会因太忙而没响应(死了)。这样所有Client都不能用了,不知如何解决。不知有没有办法使Server自动再活起来。这个问题很急请各位帮帮忙小弟感激不尽。
...全文
405 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
chensg 2001-06-05
  • 打赏
  • 举报
回复
用BORLAND数据库BDE连接数据库,BDE的”内存“设置十分重要,
并且如果是每个客户开一个会话期,只能联接48个。
具体细节,请查看李维的书籍。
Seoul 2000-08-26
  • 打赏
  • 举报
回复
>ClientDataSet通过CommandText动态传送SQL
对于需要更新的表一般不应做动态SQL的,建议你只将哪些查询过来的表什么的做动态,而需要更新的表做静态,而且需要更新的表的SQL的写法应该是SELECT * FROM ???
对于其中ID字段做成LOCKUP或在程序中用其它方法处理
GOOD LUCK
yiyu 2000-08-24
  • 打赏
  • 举报
回复
>> 1.我的 SQL是用来从中中SERVER 中下载数据到中CLIENTDATASET ,然后用户对 ClientDataSet 中的数据修改时就用 ApplyUpdatas 进行提交修改后的数据难道你们不是这样做的吗?请指
教 。
>>在多表中用多个CLIENTDATASET并没什么不好,用一个DATAMODUL我个人觉得不无不妥 谢谢你提的好意见。

不知有谁有开发过多层的经验能不能传授一点给小弟,小弟会感激不尽的 。
wizardxd 2000-08-23
  • 打赏
  • 举报
回复
1。你有SQL如何用APPLYUPDatas?这点我不懂。
2。另外,机器名称即HOST。在单机上可以不设。速度会快很多。
3。在多表中用多个CLIENTDATASET并没什么不好,用一个DATAMODUL我个人觉得不无不妥。

yiyu 2000-08-22
  • 打赏
  • 举报
回复
上文中最后两字是"用过",非度过。笔误,Soory!!
yiyu 2000-08-22
  • 打赏
  • 举报
回复
我从一开始就有用了Tsession。这个我是知道的,因为我们要面对多用户就要用多线程来做。听了大家的意见后,我已经给我原来的程序动了一个大手术,就是把原来的Server中的对外5个口(TDatasetProvider)现在被我砍了四个然后在Client中的ClientDataSet通过CommandText动态传送SQL,轮流使用真是麻烦,但计算机不觉得烦,因为它就爱干这个事可是当我一块更新好几条记录时如输入多条记录时,ApplyUpdatas(-1)时,它就发火了,而且火气很大,逼着我使出看家本领--Press The RESET Button. 后来我只好听话每更新一条记录就来一次ApplyUpdatas(-1).这样它就温顺了许多但是我觉得这不是好的办法在此再向各位名医请教良方。TDataSetProvider中的poallowMutilRecord属性好象无剂于事,我已经度过。
keboy 2000-08-22
  • 打赏
  • 举报
回复
Seoul说的对,在这种情况下,应该TSession建立多个会话线程,
当然,每次的会话名不能一样,怎样写,自己想想.
Seoul 2000-08-20
  • 打赏
  • 举报
回复
to yiyu:
你应该将你的服务器端使用了哪些控件,都是如何设置的写出来,大家才能具体地解决你所遇到的问题.
Seoul 2000-08-20
  • 打赏
  • 举报
回复
双击CLI1,添加所有的字段,CLI2的DATASETFIELDS属性列表中就会有员工表的数据集,CLI2只要设置此项就行,不需要设置REMOTESERVER等.如此服务器设置正确,ACTIVE就可能为TRUE了,更新时只需要 CLI1.ApplyUpdates(-1);即可,不需要过问CLI2 的事.
Seoul 2000-08-20
  • 打赏
  • 举报
回复
可能你不清楚如何设置主从表方式,我简单卖弄一下,献丑了.
服务器端:
放置两个TQUERY,名称分别为QRY1,QRY2;一个TDATASOURCE,名称为DS1
1. 设置两个QUERY的DATABASE.
2 QRY1.SQL.TEXT:='SELECT * FROM BMB'; //查询部门表,表中有一个ID字段为'BMID'
QRY2.SQL.TEXT:='SELECT * FROM YGB WHERE BMID=:BMID'; //员工表,通过'BMID'变量与主表BMID对应上.
3. 设置DS1的数据源为QRY1;
  DS2的数据源为DS1;
4.设置TDataSetProvider,将指向主表QRY1;
客户端:
  设置两个TClientDataSet,cli1指向TSocketConnection
cc
Seoul 2000-08-20
  • 打赏
  • 举报
回复
可能你不清楚如何设置主从表方式,我简单卖弄一下,献丑了.
服务器端:
放置两个TQUERY,名称分别为QRY1,QRY2;一个TDATASOURCE,名称为DS1
1. 设置两个QUERY的DATABASE.
2 QRY1.SQL.TEXT:='SELECT * FROM BMB'; //查询部门表,表中有一个ID字段为'BMID'
QRY2.SQL.TEXT:='SELECT * FROM YGB WHERE BMID=:BMID'; //员工表,通过'BMID'变量与主表BMID对应上.
3. 设置DS1的数据源为QRY1;
  DS2的数据源为DS1;
4.设置TDataSetProvider,将指向主表QRY1;
客启


  
Seoul 2000-08-20
  • 打赏
  • 举报
回复
to YIYU:
你应该统一建立一个DATABASE 由它来指向SQL SERVER,放置SESSION,并配置它,对于有多用户联接的情况是必须有它的,不然你的SERVER是不能建立多线程数据访问的,势力会建成多人访问时死锁.
>因此在客户端的每一个ClientDataSet 都对应服务器上的TDataSetProvider.我总觉得这样方法很笨
对于一些有主从表关系的表,或有联动关系的表可尽量用主从表方式来减少编程方面的烦杂细节.
GOOD LUCK!
Seoul 2000-08-20
  • 打赏
  • 举报
回复
to YIYU:
你应该统一建立一个DATABASE 由它来指向SQL SERVER,放置SESSION,并配置它,对于有多用户联接的情况是必须有它的,不然你的SERVER是不能建立多线程数据访问的,势必会建成多人访问时死锁.
>因此在客户端的每一个ClientDataSet 都对应服务器上的TDataSetProvider.我总觉得这样方法很笨
对于一些有主从表关系的表,或有联动关系的表可尽量用主从表方式来减少编程方面的烦杂细节.
GOOD LUCK!
yiyu 2000-08-20
  • 打赏
  • 举报
回复
我的数据库层次是这样的。
Server: TDataSetProvider-->TQuery-->SqlServer 7
Client: TClientDataSet-->TSocketConnection
ClientDataSet的PackRecords的值是-1.
因为我是对多表操作,因此在客户端的每一个ClientDataSet 都对应服务器上的TDataSetProvider.我总觉得这样方法很笨。希望有搞过这样类型的高手们给予指点。
yiyu 2000-08-19
  • 打赏
  • 举报
回复
Wizardxd!你说的机器名称是什么意思,ClientDataSet没有这个属性吧。我用的是Socket和服务器相连的用的是MIDAS中的DCOM技术。在Socket中只有host、和Address两个属性用来指定服务器的你的意思是用Address比较好吗可是我用Address好象没有什么进展。对了我的程序当对一个数据集的多条记录进行修改时用ApplyUpdates(-1)提交时会出现死机现象。这个和ClientDataSet中的
PackRecords属性有关吗?希望大家给予指点并展开讨论。
wizardxd 2000-08-19
  • 打赏
  • 举报
回复
速度和多少个IProvider端口无太大关系,慢的主要原因是你的CLIENTDATASET设置的原因,不要
设置机器名称,你会知道有多快!
rabbit 2000-08-17
  • 打赏
  • 举报
回复
关注
yiyu 2000-08-17
  • 打赏
  • 举报
回复
我是在单机上搞的,我在Server为每一个表都提供了一个IProvider端口,不知是否与这个有关,不知你们在对多表操作是时.Server上是否也是为每个表都提供一个端口还是每个表轮流使用同一个IProvider.
wizardxd 2000-08-16
  • 打赏
  • 举报
回复
都不是,你是在单机上做吗?
如果是,那么你不要设置机器名称!
如果不是,问你的网速吧
westdog 2000-08-16
  • 打赏
  • 举报
回复
我遇到过,不是太忙。而是因为client打开数据库时,加了锁,你需要在打开数据库后,立即作一次修改提交的操作,就可以搞定了
加载更多回复(6)
1、本课程是一个干货课程,主要讲解如何封装服务器底层,使用Tcp/ip长连接,IDE使用vs2019 c++开发以及使用c++11的一些标准,跨平台windows和linux,服务器性能高效,单服务器压力测试上万无压力,服务器框架是经历过上线产品的验证,框架简单明了,不熟悉底层封装的人,半个小时就能完全掌握服务器框架上手写业务逻辑。2、本课程是一个底层服务器框架教程,主要是教会学员在windows或linux下如何封装一个高效的,避免踩坑的商业级框架,服务器底层使用初始化即开辟内存的技术,使用内存池,服务器运行期间内存不会溢出,非常稳定,同时服务器使用自定义哈希hashContainer,在处理新的连接,新的数据,新的封包,以及解包,发包,粘包的过程,哈希容器性能非常高效,增、删、查、改永远不会随着连接人数的上升而降低性能,增、删、查、改的复杂度永远都是恒定的O(1)。3、服务器底层封装没有使用任何第三方网络库以及任何第三方插件,自由度非常的高,出了任何BUG,你都有办法去修改,查找问也非常方便,在windows下使用iocp,linux下使用epoll.4、讲解c++纯客户端,主要用于服务器之间通信,也就是说你想搭建多层结构的服务器服务器服务器之间使用socket通信。还可以使用c++客户端做压力测试,开辟多线程连接服务器,教程提供了压力测试,学员可以自己做压力测试服务器性能。5、赠送ue4和unity3d通信底层框架以及多人交互demo,登录,注册,玩家离开,同步主要是教会学员服务器与客户端如何交互。6、赠送c++连接mysql数据库框架demo,登录,注册,玩家离开数据持久化.7、服务器教程使用自定义通信协议,同时也支持protobuf,选择权在开发者自己手里,想用什么协议都可以,自由度高。8、服务器教程使用手动敲代码逐句讲解的方式开展教学课程。非喜勿喷,谢谢大家。9、服务器教程提供源码,大家可以在平台提供的地址下载或者联系我,服务器使用c++11部分标准,std::thread,条件变量,线程锁,智能指针等,需要学员具备一定c++知识,购买前请慎重考虑。

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧