Zumero同步SQLite数据库时返回状态码244的故障排查求助
我新开了这个问题,因为旧问题有点过时了,而且我现在有了新的信息。所有测试都是在真实设备上完成的——Android模拟器的表现不太稳定,不确定是不是和Visual Studio 2019的兼容问题导致的。
我有一个测试程序,代码量很少,运行一直很正常。我在里面加了一些数据库基础操作来排查问题,结果同步从来没失败过,哪怕我一直开着连接(只有当存在活跃的DataReader或者未关闭的事务时,同步才会失败,提示数据库被锁定)。测试程序里的连接字符串参数和客户端应用的完全一致。
测试程序的同步代码如下:
private void SyncData() { SqliteConnectionStringBuilder csb = new SqliteConnectionStringBuilder(); csb.DataSource = _dbFile; csb.ForeignKeys = true; SqliteConnection _conn = new SqliteConnection(csb.ConnectionString); SqliteCommand _cmd = new SqliteCommand("SELECT * FROM CALENDARIO", _conn); SqliteDataReader _dr = null; int i = 0; try { _conn.Open(); } catch (Exception openEx) { string msg = openEx.Message; } try { ZumeroClient.Sync(_dbFile, "", "http://***.***.***.***:nnnn", "tecnomobile", "{\"scheme_type\":\"table\",\"table\":\"users\"}", "username", "password"); } catch (ZumeroException zEx) { _errorMsg = zEx.InnerException != null ? zEx.InnerException.Message : zEx.Message; } catch (Exception genEx) { _errorMsg = genEx.Message; } try { _dr = _cmd.ExecuteReader(); while(_dr.Read()) i++; } catch(Exception readEx) { string msg = readEx.Message; } finally { if(_dr != null) _dr.Close(); if(_conn.State == ConnectionState.Open) _conn.Close(); } }
当我用平板上的“正式”应用同步时,服务器端的zumero.log表记录的错误码是244,并且向平板发送了210字节的数据。客户端捕获到的详细ZumeroException如下:
Error 500 (sglib)[ZSS 3.3.0.4342 + Android SQLite (libe_sqlite3.so)3.46.1]: Error -1 (mssql)[3.2.1.4172]: {"diag":[{"SQL_DIAG_MESSAGE_TEXT":"[Microsoft][SQL Server Native Client 11.0][SQL Server]Impossibile eseguire il commit della transazione corrente. Tale transazione non è inoltre in grado di supportare le operazioni che implicano la scrittura nel file di log. Eseguire il rollback della transazione.","SQL_DIAG_NATIVE":3930,"SQL_DIAG_SQLSTATE":"42000","SQL_DIAG_SS_MSGSTATE":1,"SQL_DIAG_SS_SEVERITY":16},{"SQL_DIAG_MESSAGE_TEXT":"[Microsoft][SQL Server Native Client 11.0][SQL Server]L'istruzione è stata interrotta.","SQL_DIAG_NATIVE":3621,"SQL_DIAG_SQLSTATE":"01000","SQL_DIAG_SS_MSGSTATE":1,"SQL_DIAG_SS_SEVERITY":0}],"SQLRETURN":-1} src\core\sg\sg_mssql.c:338 src\core\sg\sg_mssql.c:515 src\core\server\zum_db_mssql.c:13480 src\core\server\zum_respond.c:85 src\core\server\zum_respond.c:3301 src\servers\iis\main.cpp:840 src\servers\iis\main.cpp:1672 src/core/client/zum_sync.c:8118 src/core/client/zum_sync.c:12545 src/core/client/zum_sync.c:13016 src/core/client/zum_sync.c:13527
主要的区别在于:平板应用用的是一个在多个Activity间共享的静态连接,而测试程序每次都会重新创建连接。为了排除后台运行程序的干扰,我临时修改了正式应用,让它从启动到第一次同步之间不打开任何连接,但问题还是存在。
当前安装的NuGet包是:Zumero v3.3.0.4342和Microsoft.Data.Sqlite v9.0.5。
我的客户之前暂时搁置了这个问题,主要是因为我们当时在测试另一个必须在夏季前上线的应用。而且他的平板有时候能同步成功,但只有在当天第一次启动应用的时候才行;而我的测试平板哪怕是第一次启动也同步失败。
现在我必须找到解决方案,希望这些详细的异常信息能帮上忙。谢谢!
Rodolfo.
另外补充一下,服务器运行的是v3.2.1.4172版本。
内容来源于stack exchange

