Sqlite FireDac缓存更新停止更新
我正在使用SQLite数据库Delphi西雅图FireDac组件。 我有两个以上的应用程序写入同一数据库的表中。 我遇到了锁问题,因此开始使用CachedUpdates,一切都很好 问题: 当应用程序运行超过几个小时时,应用程序会停止更新“编辑”、“删除我的数据库表”、“读取”和“选择”工作正常。 OnReconcienceError中没有出现错误。此问题发生在其中一个应用程序中,同时使用同一数据库的另一个应用程序工作正常。 若重新启动有问题的应用程序,一切都会恢复正常 这就是我打开数据库的方式Sqlite FireDac缓存更新停止更新,sqlite,delphi,firedac,Sqlite,Delphi,Firedac,我正在使用SQLite数据库Delphi西雅图FireDac组件。 我有两个以上的应用程序写入同一数据库的表中。 我遇到了锁问题,因此开始使用CachedUpdates,一切都很好 问题: 当应用程序运行超过几个小时时,应用程序会停止更新“编辑”、“删除我的数据库表”、“读取”和“选择”工作正常。 OnReconcienceError中没有出现错误。此问题发生在其中一个应用程序中,同时使用同一数据库的另一个应用程序工作正常。 若重新启动有问题的应用程序,一切都会恢复正常 这就是我打开数据库的方式
LockingMode=Normal
StringFormat=Unicode
JournalMode=WAL
DriverID=SQLite
SharedCache=False
Synchronous=Full
BusyTimeout=20000
ForeignKeys=Off
典型文体
try
wQry:=TFDQuery.Create(Nil);
wQry.Connection:=form_DatabaseWork.FDConnection1 ;
wQry.CachedUpdates:=True ;
wQry.Active:=false;
wQry.sql.text:='Select * from Setups';
wQry.Active:=True;
wQry.Edit ;
wQry.FieldByName('DisplayTitles').AsString:=wMsg ;
ssPost(wQry) ;
ssApplyUpdates(wQry);
finally
wQry.Active:=false;
FreeAndNil(wQry);
end;
调用函数
procedure ssApplyUpdates(pQry:TFDQuery);
var
nErr:Integer ;
begin
nErr:=pQry.ApplyUpdates ;
if nErr>0 then
begin
pQry.OnReconcileError:=form_Tools.Qry_DummyReconcileError ;
pQry.Reconcile ;
pQry.OnReconcileError:=Nil ;
end
else
pQry.CommitUpdates ;
end;
function ssPost(pQry:TFDQuery):Boolean ;
begin
result:=false;
try
pQry.Post;
result:=true;
except
on E: Exception do
WriteSomewhere(E.Message) ;
end;
end;
procedure Tform_Tools.Qry_DummyReconcileError(DataSet: TFDDataSet; E: EFDException; UpdateKind: TFDDatSRowState; var Action: TFDDAptReconcileAction);
begin
Action:=raCorrect ;
end;
我尚未添加FDconnection.transaction。。。希望这会有所帮助。谢谢。您是否尝试过更改代码,以便执行流程遵循“应用更新”一节中的示例—这不会发生。受.NET启发,FireDAC有一个非常稳定的内部存储代码。无论它运行多长时间。这种行为的一个常见原因是启动显式事务,在事务提交之前阻止其他客户端看到更改。对于sqlite,这将是一个开始;没有后续承诺;或回滚@Brian,这不能解释这个问题。@TLama更新已完成,没有错误,但其他会话或连接未看到更新。。。。这是尚未提交的外部活动事务的模式。在这种情况下可能不是问题,但它确实遵循了模式。