2,498
社区成员
发帖
与我相关
我的任务
分享
2. Cursor Location
在MTS/COM+分布式
多层应用系统中,不管你是使用 MIDAS、RDS或其他的方法来处理数据,这些数据都会
由客户端的引擎 ( MIDAS,RDS 等)来负责处理。中间的 MTS/COM+组件在传递数据给客
户端之后就会自动被释放或被其他的客户端重复使用,因此ADO 本身的Cursor
Location 就没有什么作用了。所以建议各位在分布式多层应用系统中千万不要设定
Cursor Location为clUseServer。这样不但没有用,而且会减慢MTS/COM+组件存取数
据的速度。
3. Cursor Type
由于在MTS/COM+应用系统中不像主从架构一样是持续地和数据库连接,因此客户
端浏览或处理的数据只是cache在客户端内存中的数据。所以在MTS/COM+中的MTS/COM+
组件在使用TADOQuery 或TADOTable 存取数据时,便不需要设定等级较高的Cursor
Type,这样不但没有作用,反而增加了 MTS/COM+组件的负担。而且客户端的引擎
( MIDAS 或RDS )都有自己维护cursor 的机制,因此在MTS/COM+中我们应该只使用最
经济、负担最小的 cursor type。因此建议你只需要使用 ctStatic 这种cursor type即可。
4. Isolation Level
Isolation Level设定的原因也和前面说的一样,在客户端应用程序中处理的数据
只是 cache 在客户端的数据。在分布式多层应用系统中客户端的数据一定是和数据库
服务器没有直接连接的。程序员如果使用太严格的 Isolation Level 也没有多大的作
用,反而会增加系统使用的资源 (锁定机制 ),因此建议在 MTS/COM+组件中使用的ADO
数据集组件只使用 ilCursorStability或ilRea DCOMmitted即可。如果程序员真的很
在意数据的完整性,那么可以撰写较多的数据处理程序代码以及数据例外处理程序代
码。
5. Keep Connection
在MTS/COM+分布式多层应用系统中, MTS/COM+在执行完工作之后就应该关闭数据
库和数据库的连接,并且被释放。因此 Keep Connection这个特性值可以设定为False,
以避免不必要的负担。
6. Lock Type
当然,对于 Lock Type 来说, MTS/COM+组件使用的 ADO 数据集应该使用
ltOptimistic或ltBatchOptimistic,因为分布式多层应用系统中客户端的数据在被修
改时是和数据库没有直接连接的,因此使用ltPessimistic 没有作用,反而会在
MTS/COM+组件存取数据时使用了不必要的锁定资源。这会造成系统的执行效率降低,并
且增加数据库服务器的负担。
7. MarshalOptions
如果使用MIDAS 做为MTS/COM+应用系统中传递数据的技术,那么由于客户端应用
程序或浏览器传递到 MTS/COM+组件中的数据已经只是经过修改的数据,因此可以设定
这个特性值为moMarshalModifiedOnly,以减少ADO 驱动程序不必要的工作。
CREATE TABLE [tablea] (
[SalaryReportItemResultID] [int] IDENTITY (1, 1) NOT NULL ,
[CustomerID] [int] NOT NULL CONSTRAINT [DF__CustomerS__Custo__47136FB6] DEFAULT (0),
[MonthID] [int] NOT NULL CONSTRAINT [DF__CustomerS__Month__480793EF] DEFAULT (0),
[StaffID] [int] NOT NULL CONSTRAINT [DF__CustomerS__Staff__48FBB828] DEFAULT (0),
[SalaryReportItemID] [int] NOT NULL CONSTRAINT [DF__CustomerS__Salar__49EFDC61] DEFAULT (0),
[SalaryReportItemResult] [decimal](10, 2) NOT NULL CONSTRAINT [DF__CustomerS__Salar__4AE4009A] DEFAULT (0),
[Notes] [varchar] (100) COLLATE Chinese_PRC_CI_AS NOT NULL CONSTRAINT [DF__CustomerS__Notes__4BD824D3] DEFAULT (''),
[upday] [datetime] NULL CONSTRAINT [DF__CustomerS__upday__1D1E64D5] DEFAULT (getdate()),
PRIMARY KEY CLUSTERED
(
[SalaryReportItemResultID]
) ON [PRIMARY]
) ON [PRIMARY]
GO
Select tablea.SalaryReportItemResultID
,tablea.CustomerID
,tablea.MonthID,
tablea.StaffID
,tablea.SalaryReportItemID
,SalaryItemName
,tablea.SalaryReportItemResult
,tablea.Notes
,itemcategories
From tablea
INNER JOIN tableb On tablea.SalaryReportItemID=tableb.SalaryItemID
and tablea.Customerid=tableb.customerid
and tableb.isactive=0
Where tablea.CustomerID = :nCustomerID And tablea.MonthID /100 = :nMonthID /100
Order By tablea.CustomerID,tablea.StaffID,tablea.SalaryReportItemID
with clientdatasetA do
begin
if Locate('monthid;StaffID;salaryitemname',VarArrayOf([getMonth(SelectbeginYear ,SelectbeginMonth ),field.DataSet.FieldByName('StaffID').AsString,Field.FieldName]), []) then
begin
Edit ;
FieldByName('SalaryReportItemResult').AsFloat:=Field.Value ;
Post ;
end
end;