数据同时提交问题,各位做三层的大哥请进-----150分伺候(150分)

  • 主题发起人 主题发起人 ziyu
  • 开始时间 开始时间
Z

ziyu

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟近日在开发一套商场pos系统 Remote Data Module + SocketConnection ,
两台机器同时向Application server提交(ApplyUpdates)Pos单据时,经常会造成一个机器的
进程死掉.
在DataSetProvider的OnUpdateData事件中代码如下:
procedure TDtm_Global.PMast140UpdateData(Sender: TObject;
DataSet: TClientDataSet);
begin
WaitForSingleObject(hMutex,INFINITE);
end;
在DataSetProvider的OnAfterApplyUpdates事件中代码如下:
procedure TDtm_Global.PMast140AfterApplyUpdates(Sender: TObject;
var OwnerData: OleVariant);
begin
ReleaseMutex(hMutex);
end;
我开始怀疑是以上的问题,(一个线程没有把hMutex释放掉).但注释掉这段代码以后,照样行不通.
我的Application Server 用的线程模式是Apartment,实例模式是MultiInstance.
改换其他的线程模式:Free或Both ,问题依旧.
是不是改用MTS Data Module 会好一些?
以下是提交时,引发异常时的错误代码(有三种情况)
1. 无法手动或自动的创建连接 (大意)
2 无法在此会话中创建更多的连接 -----此种情况最多
3 连接占线导致另一个命令
各位大哥快帮帮我,工期就快到了
 
WaitForSingleObject(hMutex,INFINITE);——这是干什么用的?
并发控制的话,不一定要在中间层做,利用服务器端的lock机制就可以了
很多大型数据库支持行级锁的,MSSQL以前只支持页级锁,现在也可以支持行级锁了。
 
同意chenlili
没有必要等待一个单一的线程,remote Datamodule 自动提供多线程服务。
如果按照你的方法可能一个用户要等待另一个用户提交后才能得到服务,影响了速度,
体现不出三层的特点
 
关键是我注释掉了WaitForSingleObject(hMutex,INFINITE);都不起作用应该怎样修改呢?
更正:错误提示为
1。 无法手动或自动的创建一个新的连接
2。 无法在此会话中创建新的事物
3。 连接占线导致另一个命令
 
难道没有人肯帮帮我吗?
 
在Remote Data Module实现多个会话试试?
 
To: blbird
怎样在Remote Data Module中实现多个对话呢?能说得详细点吗?

难道各位大哥没有碰到过类似事情吗?难道真的没有人肯帮我?
 
不清楚你的数据库引擎是什么。
BDE的话,在Remote Data Module中加入TSession,AutoSessionName设为True。
在各数据访问控件的SessionName属性中设为相应Session名称,这样就可以使
Remote Data Module提供的每个线程对应一个Session。可以几个用户同时操作。
 
同意blbird的话..李维大师也是这样说的.
不过在客户端要用线程 .
 
ziyu你的问题好像是只有一个自动的Tsession..
 
To: blbird,昨夜渡轮上
我用的是ADO-----SQL Server,Session恐怕起不了什么作用吧。
有没有办法在Remote Data Module中实现多个对话呢?
 
你的问题我在用ADO时也碰到过,解决的办法有很多,要看你的能力及你的程序是怎样的
一递交过程。中间件是一个好办法,你的编程能力如何?
 
1、在使用ADO时不用Session,应该是ADO自动实现。
但你这种情况我没遇到过,ADO用得较少。
2、是否SQL Server限定会话数及连接数,具体查看相关配置,
我对SQL Server不是很熟,只熟悉ORACLE。不好意思。
3、同意rax的办法,可能结合MTS较好。
同时希望rax将他的解决办法公布出来。
 
To Rax:
提交过程就是简单的ApplyUpdate(0),有什么更好的方法吗?
>>你的编程能力如何? 指哪方面呢? 要提高哪方面呢?
实际的解决方法有么?
 
可以在保存时对记录进行判断,如果存在就修改,不存在就新增.
 
To Rax:
希望给出具体的解决方法,我24小时密切关注此题
 
我在代码里手动建立了多个ADOConnection,在连接时对应不同的帐套,会不会是
这个原因造成的?
现在在这个问题上一点头绪都没有,有哪位大虾肯帮帮我。分数不够可以再加的
 
是使用同一个DataSetProvider吗?
 
用同步事件好点
WaitForSingleObject是将Mutex置为noSigned(无人用),ReleaseMutex是将Mutext
置为Signed(有人用),一般来说这两函数是用在线程中(TThread),而不是在事件中。
如果想在事件中同步建议用临界资源TSimpleEvent
uses unit2;
...
var
YourRemoteDataModule: TYourRemoteDataModule;
MutexEvent: TSimpleEvent;

implementation
...
initialization
MutextEvent := TSimpleEvent.Create;
finalization
MutexEvent.Free;
end;

procedure TDtm_Global.PMast140UpdateData(Sender: TObject;
DataSet: TClientDataSet);
begin
MutextEvent.Enter;{如果已经有其它客户Enter,那调用会阻塞进程.等待其Leave}
end;

procedure TDtm_Global.PMast140AfterApplyUpdates(Sender: TObject;
var OwnerData: OleVariant);
begin
MutexEvent.Leave;{释放临界资源,可以让其它用户Enter}
end;

没有调试,你试试看。
 
后退
顶部