我正在使用带有SignalR的EFCore SQLite。
当有许多客户端同时连接时,数据库不能再更改(插入/更新),此异常抛出:“无法回滚 - 无活动事务”
客户端连接包含其信息的查询参数,然后:
日志:
String queryURL = "<myURL>";
HttpGet getMethod = new HttpGet(queryURL);
CloseableHttpClient cl = null;
CloseableHttpResponse response = null;
cl = getDefaultHttpClient();
response = cl.execute(getMethod);
然后
An exception occurred in the database while iterating the results of a query.
System.InvalidOperationException: A second operation started on this context before a previous operation completed. Any instance members are not guaranteed to be thread safe.
之后,当我尝试插入或更新内容时:
Microsoft.Data.Sqlite.SqliteException (0x80004005): SQLite Error 5: 'database is locked'.
有解决方法吗?这只发生在50个客户端+的生产中,因此在开发时很难调试。
任何帮助将不胜感激!
答案 0 :(得分:1)
SQLite并不打算用作服务器数据库。这是因为只能同时执行一次插入/更新。
最好使用SQL Server,MySQL,Postgre或其他一些sql数据库服务器
http://sqlite.org/whentouse.html
如果有许多客户端程序将SQL发送到同一个数据库 通过网络,然后使用客户端/服务器数据库引擎而不是 SQLite的。 SQLite将在网络文件系统上工作,但由于 与大多数网络文件系统相关的延迟,性能不会 太棒了此外,文件锁定逻辑在许多网络文件系统中都是错误的 实现(在Unix和Windows上)。如果文件锁定没有 如果工作正常,两个或多个客户端可能会尝试修改同一部分 同一个数据库同时导致腐败。 因为此问题是由底层文件系统中的错误引起的 实现时,SQLite无法阻止它。
一个好的经验法则是避免在情况下使用SQLite 将直接访问相同的数据库(无需干预 应用程序服务器)同时来自多台计算机 网络