我把砖头扔了,希望大家把砖头给扔回来!三层应该注意的问题!!!!!!!!!!!(100分)

  • 主题发起人 主题发起人 yayongm
  • 开始时间 开始时间
Y

yayongm

Unregistered / Unconfirmed
GUEST, unregistred user!
刚刚入门三层四个月,用Delphi开发的三层服务器和客户端已正式上线.中间经过了很多的失败和成功,也学到了很多经验,现在列出一些,希望大家要能把我扔出去的砖头给拣回来.
我们的开发架构是Delphi7+Midas+Socket+Win2000+SQL Server2000+ADO.
1.充分发挥APPServer的作用,因此DBServer除了数据存储外什么都没有,用Access也可以.
2.把所有的业务逻辑全写在APPServer上,客户端只有调用接口.我们测试的速度结果是:1G的CPU,128M内存可以应付50个客户端.速度潜力挖掘很大.
3.DevExpress控件的Unicode支持最好.
4.发布前一定要在客户机上注册midas.dll
5.APPServer的速度瓶颈在从DBServer取数据后然后组织数据到APPServer的内存中.几乎没有优化的余地.连Enterprise Managent也没办法.
6.Delphi做三层的优势很大,只要你好好用,绝对是当前最强的.
 
三层是以后的趋势,可是受开发环境所限,如何在单机系统(一台计算机)里开发,调试呢?
那发布时候也应该注意些什么?yayongm兄是如何做的,有什么建议不妨提出来,让我们这些后来人能够吸取.谢了.
 
1.DBServer什么也不做,说明你的设计并不好,要知道DBServer的存储过程等等效率是Appserver无法比的,不能为了Access就放弃一切。
2.同1,有的业务逻辑可以放在DBServer端,可以提高效率。
3.控件很多没法比,各有优势,比如DevExpress的grid多表头功能就很一般,比不上ehlib,图件的显示丰富性Raize就不错,自定义grid又比不上advstringgrid,看你需要做什么了。
4.midas.dll如果采用activeform开发,可以将它打包到服务端,客户端自动下载注册,如果不使用midas,客户端可以不注册midas.dll。
5.Appserver取数据的速度取决于你的程序组织方式,例如驱动程序,对oracle用dbexpress就可以比ado快10倍以上,另外数据量大时,采用压缩传输也可以增加速度,组织好的话,并不比2层慢,我试过取10万条记录甚至3层反而快,因为采用了客户端连接后就断开的方法,使得DBserver端不必像2层那样为每一个客户保留资源,已用资源可以缓存反复使用,人多反而快了。
6.我也用delphi,的确不错,只是有些东西封装过多,不好改写。
 
我正准备为单位开发一套档案管理系统,想做成三层。可是没有做过不大会使用!能具体点吗?QQ:328844156
 
三层具有很好的安全性(客户端不直接访问数据库)和平衡负载能力,确实不错。
 
我刚从PB中过渡Delphi,学习中。。。。。。
 
谢谢指教.
1.DBServer什么也不做,说明你的设计并不好,要知道DBServer的存储过程等等效率是Appserver无法比的,不能为了Access就放弃一切。
(这只是为了移植性和通用业务的封装,能做到这一步自然能执行存储过程了)
2.同1,有的业务逻辑可以放在DBServer端,可以提高效率。
(同上,封装通用业务逻辑是最重要的。我们面对的是企业级开发和真正的大规模上线使用。不是为了测试,也不是为了好玩)
3.控件很多没法比,各有优势,比如DevExpress的grid多表头功能就很一般,比不上ehlib,图件的显示丰富性Raize就不错,自定义grid又比不上advstringgrid,看你需要做什么了。
(严重同意老兄观点。但您提的这几个我们在上三个版本中都放弃了。只是因为他们的Unicode支持不好)
4.midas.dll如果采用activeform开发,可以将它打包到服务端,客户端自动下载注册,如果不使用midas,客户端可以不注册midas.dll。
(我们没有选择ActiveForm开发,我们使用瘦客户端下载安装的方式)
5.Appserver取数据的速度取决于你的程序组织方式,例如驱动程序,对oracle用dbexpress就可以比ado快10倍以上,另外数据量大时,采用压缩传输也可以增加速度,组织好的话,并不比2层慢,我试过取10万条记录甚至3层反而快,因为采用了客户端连接后就断开的方法,使得DBserver端不必像2层那样为每一个客户保留资源,已用资源可以缓存反复使用,人多反而快了。
(我们还是想在单位时间内能够做到最多的取数据而努力。如果不是因为Kylix上不能使用某些东西,我们肯定选用DBExpress了。)
6.我也用delphi,的确不错,只是有些东西封装过多,不好改写。
(多交流交流)
==================================
再一次表示感谢,同时希望更多的人来扔砖头.
 
收藏先。。。。
 
我想问一下,我用的是ADO + ACCESS 我先在不讨论客户端,只考虑,应用服务器与数据库服务器之间的关系。
假设我用 一个类封装了对客户端的接口,这个类,调用一个DATEMODULE中的ADO控件,让这些ADO控件,来和数据库打交道。
那我问的是,这个中间的应用层,我可以和客户端,做的比较好,但是,和数据库就的做的紧偶合了,因为,DATEMODULE中的ADO控件 在连接数据库时,一定要知道数据库中的项目和个各字段的名称只类的才能与数据库打交道啊。
不知版主是怎么解决这个紧偶合的问题的?
 
版主﹕
有沒有用到pooler﹐如果用到了﹐請問你在客戶端用socketconnect時又怎樣與clientdataset連接的﹐為什么我的一接連就出現災難性錯誤﹐
另外﹐你的pooler是怎樣寫的﹖
可以與大家分想嗎﹖
 
想问一下怎么建立更好的连接池?
 
1.DBServer什么也不做,说明你的设计并不好,要知道DBServer的存储过程等等效率是Appserver无法比的,不能为了Access就放弃一切。
(这只是为了移植性和通用业务的封装,能做到这一步自然能执行存储过程了)
DBServer的存储过程、视图都可以进行字典化设计,一旦设计好了,使用不同的翻译脚本就可以了通用了,Access需要在中间层单独做,这样做是为了更好的利用DBserver,当然这样做需要一定的人力和团队进行针对优化。
2.同1,有的业务逻辑可以放在DBServer端,可以提高效率。
(同上,封装通用业务逻辑是最重要的。我们面对的是企业级开发和真正的大规模上线使用。不是为了测试,也不是为了好玩)
不好意思,我是一个通用平台的负责人,我所负责的通用平台目前只能处理SQLserver、Access、Oracle,针对不同的数据库我们分别进行了优化,程序是通用的,能够同时利用Socket或WebService,不同的优化被抽象到几个不同的dll接口中,应用服务端正准备用java开发,因为面对的需求太复杂了,要知道我们只有8个程序员,要在一年中应付37个新项目(没一个一样,就不一一列了)以及160多个实施人员的不间断需求,快累死了,一般来说,15万以下的项目去年我们都只好推掉了,因为我们去年开始的项目都已经或准备在中石油强制推广了,他们已经比较认同我们的思路。
3.控件不是简单的拿来就用的,经常需要改源程序,用户的需求会导致你不得不改,例如现在我这里就有一个新需求,要求数据录入完全模拟Excel(就是用Excel定制数据录入模板)显示,但又要提供丰富的Gui操作功能,没办法,只好改advstringgrid源代码。
4.采用activeform一样也是廋客户端,不过用activeform开发问题就是多,我们也没找到很好的方法来解决维护问题,因为版本是通用的,升级几乎常年不间断,维护起来实在是太难了,有时候我自己编的程序都没有印象了,我们这整个一个油田公司的所有业务及项目现在都集中到一个Web发布服务器管理,确实有效的解决了升级问题,但也带来了很多问题,如果能有更好的办法就好了。
 
1.充分发挥APPServer的作用,因此DBServer除了数据存储外什么都没有,用Access也可以.
>>浪費,dbserver中處理數据比appserver上快N倍
2.把所有的业务逻辑全写在APPServer上,客户端只有调用接口.我们测试的速度结果是:1G的CPU,128M内存可以应付50个客户端.速度潜力挖掘很大.
>>幾十個用戶并發你的中間層就S了.
3.DevExpress控件的Unicode支持最好.
>>沒用過
4.发布前一定要在客户机上注册midas.dll
>>是人都知道
5.APPServer的速度瓶颈在从DBServer取数据后然后组织数据到APPServer的内存中.几乎没有优化的余地.连Enterprise Managent也没办法.
>>倒~~~~
6.Delphi做三层的优势很大,只要你好好用,绝对是当前最强的.
>>明白
 
1.DBServer什么也不做,说明你的设计并不好,要知道DBServer的存储过程等等效率是Appserver无法比的,不能为了Access就放弃一切。
(这只是为了移植性和通用业务的封装,能做到这一步自然能执行存储过程了)
DBServer的存储过程、视图都可以进行字典化设计,一旦设计好了,使用不同的翻译脚本就可以了通用了,Access需要在中间层单独做,这样做是为了更好的利用DBserver,当然这样做需要一定的人力和团队进行针对优化。
回hyhy:赞成,但是能省事还是省点事。
回01101:是快N倍。套您的话:地球人都知道.
2.同1,有的业务逻辑可以放在DBServer端,可以提高效率。
(同上,封装通用业务逻辑是最重要的。我们面对的是企业级开发和真正的大规模上线使用。不是为了测试,也不是为了好玩)
不好意思,我是一个通用平台的负责人,我所负责的通用平台目前只能处理SQLserver、Access、Oracle,针对不同的数据库我们分别进行了优化,程序是通用的,能够同时利用Socket或WebService,不同的优化被抽象到几个不同的dll接口中,应用服务端正准备用java开发,因为面对的需求太复杂了,要知道我们只有8个程序员,要在一年中应付37个新项目(没一个一样,就不一一列了)以及160多个实施人员的不间断需求,快累死了,一般来说,15万以下的项目去年我们都只好推掉了,因为我们去年开始的项目都已经或准备在中石油强制推广了,他们已经比较认同我们的思路。
回:hyhy,佩服佩服,通用平台负责人,有空多联系。看来你们是挺累的。不过应该有更好的办法改进。我们也是通用平台,平均每人的代码维护量是300K行代码,还没有感觉。唯一的感觉是Delphi的潜力还只是挖了一点点.
回01101:上面的测试结果已经给出了。我们的服务器在几十个并发时没有S掉。我也感觉挺遗憾的。
3.控件不是简单的拿来就用的,经常需要改源程序,用户的需求会导致你不得不改,例如现在我这里就有一个新需求,要求数据录入完全模拟Excel(就是用Excel定制数据录入模板)显示,但又要提供丰富的Gui操作功能,没办法,只好改advstringgrid源代码。
回hyhy:常有的事。我们有N多的控件都是自己开发的。没办法。只能这样做。
回01101:强烈建议用用。
4.采用activeform一样也是廋客户端,不过用activeform开发问题就是多,我们也没找到很好的方法来解决维护问题,因为版本是通用的,升级几乎常年不间断,维护起来实在是太难了,有时候我自己编的程序都没有印象了,我们这整个一个油田公司的所有业务及项目现在都集中到一个Web发布服务器管理,确实有效的解决了升级问题,但也带来了很多问题,如果能有更好的办法就好了。
回hyhy:我们的方法就是用瘦客户端安装。用类似病毒库的方法升级。至少目前看来效果还行。
4.发布前一定要在客户机上注册midas.dll
>>是人都知道
回hyhy:我花了一下午才知道要注册这个DLL,哎,我确实是太笨了。
5.APPServer的速度瓶颈在从DBServer取数据后然后组织数据到APPServer的内存中.几乎没有优化的余地.连Enterprise Managent也没办法.
>>倒~~~~
?您写个简单的程序执行以下?
var
ADS: TADODataSet;
iTime, iTwice: integer;
begin
iTwice := 0;
iTime := GetTickCount;
ADS := TADODataSet.Create(nil);
try
ADS.Connection := YourConnection;//使用您的已打开的连接
while (GetTickCount - iTime) < 5000do
begin
ADS.Active := False;
ADS.CommandText := 'Select * from ATable';//表数据至少200行
ADS.Active := True;
iTwice := iTwice + 1;
end;
ShowMessage(IntToStr(iTwice));
finally
FreeAndNil(ADS);
end;
end;
请教有无优化余地?或者告诉我在您的机器上的执行结果。
6.Delphi做三层的优势很大,只要你好好用,绝对是当前最强的.
>>明白
回hyhy:再一次感谢您的指教。给您加分。
 
回:vcanddelphi,和数据库紧耦合的问题是很讨厌,所以我们也只是用变通的方法来做。以快速高效开发为中心。怎么搞得像政治讲话了?
回:liuxiangsoft,Delphi目录Demo中的例子已经讲得很详细了,只是不够完善,你只要完善一下就可以用了.
 
To:011101
对不起,把您给忘了,感谢您的指教,也给您加分。再一次的感谢。
希望大家继续提意见。
 
有没有 DEMO 的。
 
var
ADS: TADODataSet;
iTime, iTwice: integer;
begin
iTwice := 0;
iTime := GetTickCount;
ADS := TADODataSet.Create(nil);
try
ADS.Connection := YourConnection;//使用您的已打开的连接
while (GetTickCount - iTime) < 5000do
begin
ADS.Active := False;
ADS.CommandText := 'Select * from ATable';//表数据至少200行
ADS.Active := True;
iTwice := iTwice + 1;
end;
ShowMessage(IntToStr(iTwice));
finally
FreeAndNil(ADS);
end;
end;
最最简单的两个方法,做到少量多取:
利用Oracle的序列加触发/SQLserver的自增长字段;
ADS.CommandText:= 'Select * from ATable>:recor_ID';表设计一定要隐藏包含recor_ID,更新搜索用,克服3层断开的缺陷,不会在更新时说别人已经修改了,前台记录并传递recor_ID。
ADS.MaxRecords=200,两者结合。
ADS.CursorType=ctOpenForwardOnly;
ADS.CacheSize=200;
你再试试,当然用池的方法还可以加快。
 
后退
顶部