您当前的位置:delphi教程 > Delphi笔记 >  三层的问题

三层的问题

问题:三层的问题 ( 积分:200, 回复:34, 阅读:537 )
分类:系统相关 ( 版主:luyear, zyy04 )  
来自:hfghfghfg, 时间:2004-6-28 12:31:00, ID:2684589 [显示:小字体 | 大字体]  

几年前我开始使用三层的模式,DCOM和SocketConnection都用过。
个人感觉DCOM 快速但麻烦,SocketConnection有点慢。实际应用
时一般是20多个客户端,50个客户端的也有。其间遇到了许多的问
题如:DCOM在98下的设置,防火墙,超线称,事物,AppServer 回
调client等 实在太多了,虽然这些问题都不难解决。但是我却感到
了许多的疑问,三层的优势到底在那里,我不否认他确实有很大的
魅力,比如说模块的划分,离线模式(我的程序要保证在在网络突然中断
的情况下照常工作)等。但是在真正的应用时却魅力越来越
小。想来可能是程序需要经常改动的缘故吧。可仔细想想,在中国
你无论如何做调研你都不可避免经常的改动(特指小项目{包括几十万的
his之类的项目})。你甚至要在十几分钟内一边同客户聊天,一边
画完一张很复杂的报表。更有甚者,每人都要你按照他的意愿改,
不改就和你不算完。(真实经历 在XXX医院 改了17 遍后,客户说
就用第一次的)。三层还用一个问题就是速度(不考虑客户端几千个
,多服务器的情况,这种情况我用b/s ,我的一个老师就是擅长b/s开
发的,她教了我许多开发上的思想)。于是我开始困惑了,
三层的含义到底是什么?我开始许多古怪的尝试。在一个进程内的
三层,就是在进程内进行分为多层,一个明显的特点就是,所有窗
体都没有引用数据模块,只有负责处理业务逻辑的unit 引用了数据
模块。另外还做了一个尝试就是将不同的层封装到不同的bpl中去(
效果不好,做安装文件时麻烦)。这样俺的程序出现了独特的样子,
主窗体只引用了一个公用的unit而不再引用各个窗体,各个窗体不再
引用数据模块。在工程中随意删掉几个窗体,照样可以编译(当然这
些窗体不会再出现)。运行也不会报错。看来我是邪派的(可能是啃
多了猪脚的原因),就像在
下面的qq记录中一样,你说我的代码面向的是"过程"还是"对象",反
正我写的候从没想过要面向什么,如果硬要面向某种事物的话,那就
是面向自己。什么是"面向对象",什么是"面向过程",谁能说的清楚
呢?反正我说不清。
---“看山不是山,看水不是水”还是“见山是山,见水是水” :D



关于程序界面的问题,以后再说。



我的聊天纪录。(with 翱翔) 

2004-06-28 08:45:54 翱翔
hi
老兄,你对面向对象这方面熟吗? 

2004-06-28 08:41:01 鸽子
我喜欢面向过程,
因为这才是最快的。 
  

2004-06-28 08:47:34 翱翔
哦?
现在好象面向对象是一种时尚是吗? 

2004-06-28 08:42:14 鸽子
各有各的好处。 
  

2004-06-28 08:50:21 翱翔
呵呵
我现在想用面向对象设计数据库程序。
可是现在发现不是那么简单,还要有设计模式的思想,和什么OOA/OOD之类的东西,老兄你接触过这些吗? 

2004-06-28 08:47:08 鸽子
面向对象设计
首先要 熟悉 业务 不熟悉 业务 如何定义对象。
比如说:
type
  TReport = class
  private
    FId: string;
    FResultList: TResultList;
    FValues: TstringList;
    FModified: boolean;
    FonReportChange: TonReportChange;
    FonReportLoad: TonReportLoad;
    FonReportSave: TonReportSave;
    procedure SetId(Value: string);
    function GetstrValue(const Key: string): string;
    procedure SetstrValue(const Key, Value: string);
  public
    constructor Create; overload;
    destructor Destroy; override;
    procedure save;
    procedure clear;
    function getMoney: string;
    function isPOSITIVE: boolean;
    procedure ExportToStream(Stream: TStream; DataFormat: string);
    procedure ImportToStream(Stream: TStream; DataFormat: string);
    property onReportChange: TonReportChange read FonReportChange write FonReportChange;
    property onReportLoad: TonReportLoad read FonReportLoad write FonReportLoad;
    property onReportSave: TonReportSave read FonReportSave write FonReportSave;

    property Id: string read FId write FId;
    property ResultList: TResultList read FResultList;

    property Modified: boolean read FModified write FModified;
    property strValues[const Key: string]: string read GetstrValue write SetstrValue;



  end;
  

2004-06-28 08:58:12 翱翔
现在我有这样的一个问题:
    现在我假定有2个类TUser,TSubject
    TUser类:代表客户,有Name,Sex,Age..等属性
    TSubject类:代表科目类,有id(科目编号),Name(科目名称)..等属性
    这两个类都有类似的操作,也就是一般的数据操作(添加,删除,更新等),但是假如要是添加,删除都是对整个用户集操作也就是对TUser的集合操作,而更新是对单个的用户TUser操作,要是这样的话我是不是还要设计一个TUserSet类,它里面的单个对象是TUser?
    TSubject类也是这样 

2004-06-28 08:52:59 鸽子
你是学生吗? 
  

2004-06-28 08:59:07 翱翔
不是

 

2004-06-28 08:59:39 翱翔
我上班快7年了,不过我原来不是干这个的 

2004-06-28 09:00:40 翱翔
我学编程也就是1年 学Delphi 10个月:)
 

2004-06-28 09:02:03 翱翔
老兄是不是嫌我很菜? 

2004-06-28 08:56:52 鸽子
最好不要用类,用存储过程。
总之 要用面向对象的方法 分析问题 然后用面向过程的方法 实现。 TUser,TSubject
最好 从一个 基础类 继承 下来。 
  

2004-06-28 08:58:59 鸽子
不要设计TUserSet 
  

2004-06-28 09:05:02 翱翔
要是这样的话,这两个类有什么相似的地方能抽象出来?
 

2004-06-28 09:05:50 翱翔
谢谢
为什么不能设计TUserSet?[?] 

2004-06-28 09:01:10 鸽子
还有 如果 User 的数据 如果 只在一张表中
就根本 不需要 设计 类。

 
  

2004-06-28 09:08:58 翱翔
哦
不过为什么是这样呢?
我好象看到大富翁上有人提过‘一表一对象’这样的概念呢 

2004-06-28 09:04:43 鸽子
一表一对象 
直接用 dataset 就行了
dataset 封装 的多好啊。
 
  

2004-06-28 09:05:50 鸽子
我的 TReport 可是 涉及 几十张表啊。 
  

2004-06-28 09:13:23 翱翔
也是
我是刚涉足到面向对象这块,很多问题都不懂
刚才你说不要设计TUserSet,为什么呀? 

2004-06-28 09:13:55 翱翔
我看你设计的TReport设计的真好:) 

2004-06-28 09:12:09 鸽子
一个 dataset 就搞定了。
面向对象 就是 将 业务关系 封装到对象中。
一张表 如果 没有 太多的 业务关系,如何封装。
根本 没有 可以封装成对象的 业务。如果 这种情况 还要 封装 可以说 是 “没事找事”。 
  

2004-06-28 09:18:05 翱翔
我现在就是想弄清楚
单个的记录,整个集合
这样的关系怎么设计?
比如,一个用户是一条记录,很多记录是用户的集合 

2004-06-28 09:12:33 鸽子
参考Tdataset 
  

2004-06-28 09:20:49 翱翔
呵呵
还有一般是怎么样把业务关系,和数据存取结合在一起? 

2004-06-28 09:16:01 鸽子
TUser 是一个对象, 你可以通过它 得到一个集
也可以 增 删 改。甚至可以 模糊查询,存成文件,
web 发布。
业务关系,和数据存 我是靠事件的。 
  

2004-06-28 09:16:45 鸽子
type
  TonReportChange = procedure(Sender: TObject; key, oldValue, Avalue: string) of object;
  TonReportLoad = procedure(Sender: TObject; Id: string) of object;
  TonReportSave = procedure(Sender: TObject; Id: string) of object;

  TonResultLoad = procedure(Sender: TObject; Id: string) of object;
  TonResultSave = procedure(Sender: TObject; Id: string) of object;
  TonResultDelete = procedure(Sender: TObject; Id: string; isAll: boolean; v: TResult_Item) of object;
  TonResultAdd = procedure(Sender: TObject; Id: string; v: TResult_Item) of object;
  TonExportSomething = procedure(Sender: TObject; var Lable, v: string) of object;

  

2004-06-28 09:25:53 翱翔
老兄能把实现的方法,怎么样使用的代码片段给我看看吗? 

2004-06-28 09:20:32 鸽子
这个可能不行 
  

2004-06-28 09:27:01 翱翔
我原来都是用方法和过程实现和数据存储的
还没有想到过用事件,呵呵 

2004-06-28 09:21:11 鸽子
还有 我 面向 过程的 
  

2004-06-28 09:22:35 鸽子
靠事件 也算 面向过程
事件 只 不过 是过程的地址 罢了。

 
  

2004-06-28 09:30:10 翱翔
我只要一个片段行吗?
比如TOnReportLoad = procedure(Sender: TObject; Id: string) of Object;的实现方法
就一个,我只是想学学,没有别的意思 

2004-06-28 09:24:42 鸽子
我找一下。 
  

2004-06-28 09:30:46 翱翔
谢谢
 

2004-06-28 09:26:33 鸽子
procedure TReport.SetId(Value: string);
var
  str: string;
begin
  //
  FId := Value;
  clear;
  if assigned(FonReportLoad) then
    FonReportLoad(self, FId);
  FResultList.Id := FId;

  。。。。。。。。。。。。。  

2004-06-28 09:27:01 鸽子
 property onReportLoad: TonReportLoad read FonReportLoad write FonReportLoad;  

2004-06-28 09:29:43 鸽子
property Id: string read FId write SetId;

流程 在 xxx.id:='21301'时
执行 SetId()
执行if assigned(FonReportLoad) then
    FonReportLoad(self, FId);

  
  

2004-06-28 09:37:22 翱翔
哦
但是真正的FOnReportLoad这个事件的内容,还是自己在OnReportLoad事件写,是吗?
 

2004-06-28 09:33:09 鸽子
是的,因为 我的数据库 经常换 所以
OnReportLoad 有多种形式   

2004-06-28 09:34:14 鸽子
我的类 封装的 纯属 业务   

2004-06-28 09:42:20 翱翔
实际上对数据库的存取是在OnReportLoad事件里呢,这样可以把业务逻辑和数据存取分开,是这样吗? 

2004-06-28 09:36:42 鸽子
是的   

2004-06-28 09:43:27 翱翔
为什么不考虑设计一个类专门负责数据存取呀? 

2004-06-28 09:39:14 鸽子
有 数据模块 呢
你 加一些 自己的方法,事件。。。。
就是一个不错的类。   

2004-06-28 09:47:59 翱翔
哦
看来这种方法确实值得参考,我好好研究一下
感谢[:)]
我以后再有问题的话,还是麻烦你 

2004-06-28 09:42:57 鸽子

还有 我 是 面向过程 的开发
面向对象 我 不会。   

2004-06-28 09:50:46 翱翔
呵呵
看来面向对象不能死套,要灵活运用
其实只要代码易懂,好维护,管他是不是面向对象的呢,是不是这样? 

2004-06-28 09:46:14 鸽子
你说的太对了。
[strong]   

2004-06-28 09:52:29 翱翔
谢谢得到你的赞同 

2004-06-28 09:53:41 翱翔
老兄
你今年多大了? 

2004-06-28 09:48:20 鸽子
26
如果 我把 我们的qq记录发到delphibbs上你不反对把。 
  

2004-06-28 09:54:36 翱翔
不反对[:D] 

2004-06-28 09:57:01 翱翔
老兄你编程几年了?
用delphi几年了? 

2004-06-28 09:51:14 鸽子
4
4 
  

2004-06-28 09:58:12 翱翔
我觉得你现在的水平很不错
什么时候才能到这样的水平呢? 

2004-06-28 09:52:48 鸽子
我是瞎说。 
  

2004-06-28 09:59:03 翱翔
呵呵
[:)] 

2004-06-28 09:59:35 翱翔
好了
不耽误你工作了
以后多交流好吗? 

2004-06-28 09:54:36 鸽子
ok 
  


YBF 14:55:17
英雄,救命。 
鸽子 14:44:40
说 
YBF 14:57:26
三层的,调应用服务器的方法出错。
用线程调的。
报error reading socket 
鸽子 14:47:24
同步
或
创建一个连接 
YBF 14:59:16
具体点。 
鸽子 14:48:40
调应用服务器的方法
是用同步 
或线程用专用的连接。 
YBF 15:02:19
(2004-06-30 14:48:40)   鸽子
调应用服务器的方法
是用同步 
或线程用专用的连接。//怎么专用?create一个socketconn?  
鸽子 14:51:10
create一个socketconn 对 
YBF 15:04:32
这个麻烦。
如果同步怎么搞?
Synchronize么? 
YBF 15:09:10
英雄,好像可以了。
你以前碰到过么? 
鸽子 15:18:06
没有 猜的 
YBF 15:32:36
厉害,这都能猜对。
我正准备跟源码的。
幸好你及时赶到。 
鸽子 15:21:42
    


来自:muhx, 时间:2004-6-28 12:45:44, ID:2684627
学习中...  


来自:hbsxcjp, 时间:2004-6-28 13:01:19, ID:2684657
很高兴看到这样的对话,感谢'爱啃猪脚的人',您是鸽子吧[:D]
学到了一种思想,编程的关键还是思想啊.[^]  


来自:wfzha, 时间:2004-6-28 13:20:35, ID:2684704
楼主说得俺同意一半,要执行效率的时候,还是面向过程好用,但开发效率,除非代码只用一遍,否则还是面向对象的好。即使只用一遍,面向对象的也容易维护。有时,面向对象对理解程序还是有好处的,只不过思维方式与面向过程的时候不同罢了。如果转换过观念来,面向对象效率虽然略低,但好处还是很多的。
从另一个角度看,在delphi中写代码,无论怎么用,其实都是封装在类中的。楼主说得也不错。我觉得把基本固定的业务流程和相对容易变动的业务流程分别在不同的层面封装是个不错的主意。这样便于维护。  


来自:hfghfghfg, 时间:2004-6-28 13:36:38, ID:2684733
我的意思 是 
面向对象 还是 面向过程 何必强求,
 一切 随心 就是 最好 的。 
对象 还是 过程 不过 就是 色与空罢了。
  


来自:hardware007, 时间:2004-6-28 15:30:50, ID:2685026
关键是思想  


来自:DoubleWood, 时间:2004-6-28 15:33:01, ID:2685032
这个帖子是……发猪脚吗?
偶也喜欢啃猪脚[:D]
不管怎么做,只要好吃,就是好猪脚[:D]  


来自:blyb, 时间:2004-6-28 17:24:52, ID:2685291
对我这样的老同志来说,还是面向过程来的简单方便。  


来自:hfghfghfg, 时间:2004-6-28 18:11:42, ID:2685420
to blyb:
 是啊,俺 不懂 面向对象与面向过程 的 区别。
所以就 “对象中有过程,过程中有对象” 了。  


来自:blyb, 时间:2004-6-28 18:15:58, ID:2685423
所以我写的程序都是二姨子(新疆话)程序[:D][:D][:D][:(]  


来自:t1122, 时间:2004-6-28 19:05:02, ID:2685517
非常非常赞同hfghfghfg。
无论面向对象还是面向过程,都是为了程序。  


来自:vmao, 时间:2004-6-28 19:44:26, ID:2685576
上次,有一个人也在QQ上问我十分类似的问题。
可惜我功力没有楼主那么深厚,和他解释不清,也就没有理他。
下次就可以直接引用了,收藏先~
  


来自:lich, 时间:2004-6-29 12:40:18, ID:2686620
变态的面向对象是面向对象的一种,有很多人在用  


来自:hfghfghfg, 时间:2004-6-29 12:43:06, ID:2686626
假作真时真亦假,无为有时有还无 
  


来自:lich, 时间:2004-6-29 13:24:18, ID:2686709
麻烦谁解释一下,业务关系和业务规则,
如何实现独立封装  


来自:CB8u8, 时间:2004-6-30 14:39:48, ID:2688734
做过三层,先做个标记,马上再看  


来自:nc2t, 时间:2004-6-30 18:55:29, ID:2689195
我就是翱翔呵呵
很高兴看到我和鸽子老兄的对话能贴在这里,
有时间大家一起讨论这个问题好吗?
多谢鸽子老兄  


来自:wfzha, 时间:2004-7-1 22:43:35, ID:2691636
又改题目了:D
我觉得三层的好处有下面几个:
  一个是用户数量很多的时候,C/S模式的扩充余地很小,但
在三层模式下,我们可以用多个前置机来处理客户端的请求。可以用object pooling 和
数据库session pooling来控制同一时间访问服务器的客户端的数量,但C/S做不到。
  再一个就是这时我们可以更好的结合面向对象的思想,把不同的业务规则封装在不同的层面,维护和升级系统的时候方便很多。
  再一个就是公文包模式,这也是个优势。
  三层系统的高效率,主要表现在两个方面:1、大量客户端同时使用的时候。2、开发和维护、升级的时候。
     


来自:楚非帆, 时间:2004-7-1 23:09:00, ID:2691664
太扎实了,建议咨询softdog.  


来自:junjunlin111, 时间:2004-7-1 23:13:52, ID:2691667
我出做过三层,看了各位的发言,领悟不少!  


来自:hfghfghfg, 时间:2004-7-2 8:46:13, ID:2691863
wfzha:
我也感觉的一些 三层的 好处。但是
户数量很多 俺实在没感到三层的 好处。
才200个户数 就很慢了。

公文包模式倒是经常用的(我的程序要保证在在网络突然中断 的情况下照常工作)

虑客户端几千个,多服务器的情况,这种情况我用b/s 

我现在就在做b/s开发。

开发和维护、升级的时候 实在 三层实在 麻烦,
每台机器的 防火墙 都要改。真是辛苦啊。
而且 midas 有太多的问题了, 
超过5用户的midas 还要 向 borland 买。
哎。 已经四年了。
  


来自:迷糊, 时间:2004-7-2 13:34:09, ID:2692592
负载平衡和容错 应该是三层的优势吧,如果这个做好的话应该可以负载很多用户。当然b/s也可以,但是对于实现较繁杂界面功能b/s还是不如c/s。
另外midas用起来确实有些碍手碍脚,所以不用也罢  


来自:lich, 时间:2004-7-4 10:47:35, ID:2694851
其实,三层有一定的优化余地,
如果你的CPU足够快的话,可以考虑进行数据压缩

经常访问的数据可以进行内存缓冲,
对数据的维护都先提交到内存,然后再更新到数据库,
用户查询时,如果距上次查询的时间较短,
可以直接返回内存中的数据,

对于,比较稳定的很少变化的数据,尤其可以用这样的方式,

还有重要的一点,就是,减少应用服务器和客户端之间的
数据传输量和传输次数,
因为用户在一段时间内能修改或查看的数据量总是很有限的
返回太多的数据没有意义,

查看用户访问是否真的是并行的(通过日志的时间和数据库跟踪)
如果不是,则需要分析原因并解决

和数据库存储过程结合,
会大大加快数据检索和处理的速度

如果你的三层应用,根本没有考虑优化,
就说速度慢,是不是有点太草率了呢?
  


来自:幻世星龙, 时间:2004-7-4 10:48:49, ID:2694852
我也想做B\S的东西  


来自:lich, 时间:2004-7-4 10:54:32, ID:2694859
其实,数据的访问和修改有多种模式,
常用的只有几种,如果实现了几种之后,
那么,你的应用服务器就不需要太大的改动了

下面是我总结的几种:
1.单数据集 加 查找字段 和 选择字段
2.主细表 加 查找字段 和 选择字段
3.多层次主细表 加 查找字段 和 选择字段
4.仅查询
5.执行SQL

对于多层次主细表,
请求数据时,传递 多个SQL(以嵌套数组方式传递)
同时传递需要进行查找或选择的 字段列表
服务器端返回必要的数据
(如果数据量较大,考虑使用无状态数据模块)

如果三层速度慢,
还有一点, 看有没有使用数据连接缓冲池
  


来自:renyi, 时间:2004-7-4 11:50:11, ID:2694906
智能客户端,最新的技术,你听说过没有?  


来自:lich, 时间:2004-7-4 12:42:03, ID:2694963
设计一个通用的多层次主细表数据模块

此模块可以响应各种多层次主细表的检索请求,
同时能够完成多层次主细表的更新需要

查询请求需要附带参数,
包括主查询和各个明细表查询语句,以及明细查询和主查询之间的关联字段
可以用OleVariant数组来保存此参数,
层次为

主查询
    明细查询1,
    关联字段列表
        关联字段1
        关联字段2
    明细查询2
.......
使用多层次的动态数组可以保存此参数
服务器端根据参数层次,
构造检索数据需要的各个数据集,
并设置他们之间的关系  


来自:hfghfghfg, 时间:2004-7-5 9:15:44, ID:2695916
三层的速度:
 你只要连续插入一千条 图形数据 就知道了。
 //另外 你监视一下内存。
 三层的查询 不慢 但是 大量数据插入 (用参数模式) 就不够好。

速度
  dcom > socket > webConnection
而且 速度不是差一点。



经常访问的数据可以进行内存缓冲,
对数据的维护都先提交到内存,然后再更新到数据库,
用户查询时,如果距上次查询的时间较短,
可以直接返回内存中的数据,
对于,比较稳定的很少变化的数据,尤其可以用这样的方式,

这和三层无关。


经常访问的数据  我将它放到数组中去

  ItemNameRecord = record
    Id: string[20];
    ItemEName: string[40];
    ItemCName: string[40];
   。。。。。。。。。。。 
    CanPrint: boolean;
  end;
而且自己建 索引。

我在做单机,c/s就是这样了。




  


来自:hfghfghfg, 时间:2004-7-5 9:17:48, ID:2695922
  ItemNameRecordList: array of ItemNameRecord;
  


来自:lich, 时间:2004-7-5 16:01:11, ID:2696939
呵呵,说到速度,
BDE > SQLDirect > dbexpress
而且速度不是差一点,有可能差好几倍

插入1000条图形数据,
呵呵,用什么数据库都不会太快的
假设网络数据传输需要20秒,那么两次数据中转的时间就是40秒,
至少要慢一倍,除非应用服务器和数据库服务器放在同一台机子上,
而且这么多数据全放到内存中,内存的分配和处理也会占去一些时间
呵呵,恐怕三层应用是不擅长这方面的内容的,

但是,如果并行处理时间会缩短不少的  


来自:lich, 时间:2004-7-5 16:24:10, ID:2697005
对于大量数据的插入,
可以采用分段提交的方式,
内存中尽量少缓冲没有必要的数据,
甚至可以将SQL语句传递给存储过程,
进行批量执行。
对于内存的不同使用方案,造成的结果会有天壤之别

所有的事情都不是完美的,
三层有它自己的特点和应用范围,拿短处比长处是没的比
三层只是一种可以选择的技术,
古人说的好,汝果欲作诗,功夫在诗外,
天天用Delphi,不见得你所接触的东西都是和Delphi有关的,
但也不是完全无关的,古人说,它山之石,可以攻玉

我不在乎它是不是叫做三层,是不是万能和通用的,
但可以作为一种选择,有它的特色和优势,
当然,也有缺点和不足,这种缺点和不足有时候是可以克服的
使用的方法,当然和三层无关

多层应用在以下几种情况,可以考虑进行选择
1。有限的数据库连接需要同时为更多的客户端服务,
  可以使用三层技术进行扩展
2。封装接口,不允许客户端了解数据库内部的细节
3。更好的安全控制,除了预定义的方法,
  不能做其它的事情
4。瘦客户,绿色免安装的客户端,即拷即用
  不需要安装数据库支持
5。服务端封装一些业务规则,和数据模式,
  这样,客户端的实现将会更加简单

当然,可能还有很多其它的情况,
这只是凭我的经验所能想到的,和教科书的也许不同



  


来自:lich, 时间:2004-7-5 16:28:19, ID:2697025
SocketConnection是比较慢,
不过慢的原因在哪里呢  


来自:leonv, 时间:2004-7-5 19:11:31, ID:2697432
想向楼主请教一下 AppServer 回调 client 的问题,如何实现的,有例子么?!
查了好多资料,都没有相关介绍。  


来自:hfghfghfg, 时间:2004-7-6 13:43:07, ID:2698670
D4 开发人员指南 下册
不过 附带的例子 不对  


来自:wfzha, 时间:2004-7-6 20:24:49, ID:2699309
三层慢,其实是object pooling做的有问题,midas没有提供这方面的功能,目前只能用com+的,其实,自己写也成,严格的说,b/s也是三层,只不过应用程序服务器换成web服务器了,不是自己写的罢了,如果你的pooling能写的达到web的效率,速度就行了。midas是有点老了,delphi7出来这么久了,midas也不升升级,是不是borland想
放弃他啊?  


 
问题讨论没有结束 ... 
xiatao__,对此问题,您可以:


8  8  8  
8 添加您对此问题的注释(请注意换行)

--------------------------------------------------------------------------------
正文标题一标题二标题三标题四黑色红色蓝色棕色绿色金色黄色紫色        --程序    更多 ...
--------------------------------------------------------------------------------


8如果有人回答了这个问题,请用 email 通知我。

 

在这里发贴,表示您接受了大富翁论坛的 游戏规则 和 版权协议
 
 
 
 

(C) 版权所有,大富翁论坛 1998-2004
感谢您的惠顾,如有任何建议和意见,请 联系版主。2004.3.20 


查看回复
关于我们 | 网站地图 | 广告刊登 | 友情链接
Copyright ©2008 - 2010  Delphi2007.net  ,All Rights Reserved  粤ICP备09038647号
业务联系:allceoad#gmail.com QQ:20008835 最佳分辨率 1024×768