(150分)关于三层结构中的一些问题,请大家进来看看。(50分)

  • 主题发起人 主题发起人 次时代
  • 开始时间 开始时间

次时代

Unregistered / Unconfirmed
GUEST, unregistred user!
问题是这样的:
我有一个表,有大楖170多万条记录吧。我直接通过QUERY或ADOQUERY读取全部记录,花费时间一般在30-40秒之间,而用三层结构的方式时进读取时却用了[red]20分钟[/red]。不要问我为什么要读取这么多记录,我只是在测试一下它们的效率。但这时却出现了一个十分严重的问题,直接读取后统计记录数为1719551条,完全正确,可用三层后统计记录数为115万条,而且每次读取后的记录数都不一样。如果只是效率问题,可以通过优化等方式提高,可记录数不准是为什么呢?
因此我想和大家讨论一下关于三层结构的效率和准确性的问题。希望大家能提供帮助。
(本贴有50分,其它分在 http://www.delphibbs.com/delphibbs/dispq.asp?lid=2069485 )
 
怎么大家光看不说啊,有可以讨论的吗?
 
你读取大量记录三层肯定不如两层,你想中间层先从服务器把数据读出来,再
打包(实际上是XML)把数据发给客户端,客户端接受数据还要解包,能快才怪。
所以三层不是为了提高为了提高读取记录速度设计的,而是为了封装逻辑,提高可
伸缩性用的.
至于记录数,你datasetProvider 的设置可能有问题。
 
我的DataSetProvider设置是按它的默认做的,如下:
object Provider_sql: TDataSetProvider
DataSet = server_SQL//query控件
Constraints = True
OnDataRequest = Provider_sqlDataRequest//数据请求事件
Left = 86
Top = 1
end
//数据请求事件
function Tjc_server.Provider_sqlDataRequest(Sender: TObject;
Input: OleVariant): OleVariant;
begin
with (Sender as TDataSetProvider)do
begin
server_sql.Close;
server_sql.SQL.Clear;
server_sql.SQL.add(input);
set_Prepare(server_sql);
//server_sql.ExecSQL;
Result :=Provider_sql.Data;
end;
end;
这样有问题的话,那问题在哪呢?
要知道如果是读取几万条记录,取得的记录数是正确的,可上百万条为什么出错呢?
 
为什么没人回答我的问题呢?
是我提问的艺术不高还是问题不值的回答?
我以前发的好几个贴子也是只有看家没有帮忙的人。
唉。。。。郁闷啊。
 
有这种方法测试效率是没有意义的
 
准确性本身没有问题,你的用法上可能要做些调整,在此不清楚你的DatasetProvider和ClientDataSet的设置,不好随便说。
在小客户量的情况下,多层系统的性能比C/S结构的慢是必然的,做小客户端数量、大数据量存取的试验是没有意义的——因为结果是必然的。
 
我正在搞第一个多层结构的系统,严重关注。。。。
不知这个问题是否也会发生在我身上????
另外想问:除子记录数统计不准确外,各种报表的结果正确吗????
这才是最主要的。。
 
想请教一下,Mts/COM+三层结构是不是也算是界面和数据分离啊? 跟MVC结构区别在哪里?
 
xujh:
我一开始就说过:如果只是效率问题,可以通过优化等方式提高,可记录数不准是为什么呢?我主要是问为什么记录数不准的问题。
Sachow:
DatasetProvider的设置我以贴上去了。
ClientDataSet用的都是他的默认设置。
如果一个客户读取170万条记录的测试是无意义的那1000个客户各读取1700条记录的测试就是的吗?我想在这种情况下三层的效率未必一定高于C/S结构的。
如果大家有条件的话,可以试下通过三层方式读取一个有170万条记录的表来测试一下,看看我的这种情况是个别的还是普遍的。
 
这种大数据量要考虑的是Ado和SqlServer的结合问题,应该不是我们能解决的;
其实有个最简单的解决办法,就是在后台服务器端多运行一个语句
select count(*) from XXXX,把他当作一个包传会前台,在解析就行了,尽量不用
Tclientdataset.Recordcount的属性,因为你的是分布式应用;
 
这是你的bde设置问题!
 
我重新做了一个测试,把以前的select * from ckm 语句改为 select ckdh form ckm虽然也用了20多分钟可查询后的记录数却正确了。因此我认为这个现象应该理解为ClientDataSet控件在处理大数据量时有BUG,具体的我还没找出来。我将进一步进行这方面的测试。
lzhuan:我是在ODBC中建立的别名,在BDE中没有修改什么。你能指出具体是BDE的什么设置出了问题吗?
old_pan:如果用C/S结构,BDE和ADO都会在一分钟以内查询完成而且不会有问题。这应该和用不用ADO没有关系。
 
要从服务器分页取数据!在三层不要clientdataset1.open全部数据取过来嘛!
下边贴子好有参考价值啊!
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1099676
 
170万条记录,非要用3层一次取过来?
你怎么不用汇编来写大型数据库管理程序啊?
不同的体系结构和不同的工具,是为不同的应用来产生的。用飞机去打蚊子,效率一定没有用灭蚊喷雾的小罐子的效果好。
 
大家好象只对效率感兴趣,[red]我主要是问的为什么取过来的记录数不准确的问题[/red],效率的解决方法有很多。
 
因為打包文件的容量有限制, 具體數量, 待查.
 
我想是根本没有读出所有的数据呀!
让记录显示最后一条。显示记录数正确吗?
是不是操作系统帮你做优化了呀!呵呵。
使用“select ckdh form ckm”时,显然数据量小了很多。
如果是这样,应该和操作系统有关。
 

Similar threads

S
回复
0
查看
835
SUNSTONE的Delphi笔记
S
S
回复
0
查看
765
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部