Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sqlite3\u open\u v2在windows上可以超过60秒的已知原因?_Sqlite_Poco - Fatal编程技术网

sqlite3\u open\u v2在windows上可以超过60秒的已知原因?

sqlite3\u open\u v2在windows上可以超过60秒的已知原因?,sqlite,poco,Sqlite,Poco,我将从TL开始;DR版本,因为这对你们中的一些人来说已经足够了: 我们试图研究我们在C++产品诊断数据中看到的问题。 问题被确定为是由sqlite3\u open\u v2上的超时引起的,该超时估计需要60秒才能完成(我们只给它60秒) 我们尝试了多种不同的配置,但始终无法重现此呼叫的5秒延迟 所以问题是,是否有一些已知的情况下,sqlite3\u open\u v2可能需要那么长的时间(在windows上) 现在来了解详情: 我们正在使用SQLite的版本3.10.2。我们查看了这个

我将从TL开始;DR版本,因为这对你们中的一些人来说已经足够了:


    我们试图研究我们在C++产品诊断数据中看到的问题。
  • 问题被确定为是由
    sqlite3\u open\u v2
    上的超时引起的,该超时估计需要60秒才能完成(我们只给它60秒)
  • 我们尝试了多种不同的配置,但始终无法重现此呼叫的5秒延迟

所以问题是,是否有一些已知的情况下,
sqlite3\u open\u v2
可能需要那么长的时间(在windows上)

现在来了解详情:

  • 我们正在使用SQLite的版本
    3.10.2
    。我们查看了这个版本到目前为止的变更日志,在bugfixes部分中没有发现任何迹象表明在连续的SQLite版本中解决了一些问题,可能导致了我们的问题
  • 我们看到的问题影响到所有受支持的windows版本(Win 7、Win 8、Win 10)中约0.1%的唯一用户。没有手动用户投诉/报告-这可能表明在用户机器/系统发生严重问题的情况下发生了问题,他不希望任何工作。因此,只要有0.1%的随机windows用户可能发生系统范围内的故障,那么表明系统范围内的故障就是一种有效的可能性
  • 没有数据表明相同的问题曾经在Mac上发生过,Mac也是一个具有足够大的诊断数据样本的受支持平台
  • 我们正在使用Poco(,版本:1.7.2)作为访问SQLite数据库的工具,但是我们已经分析了Poco代码,似乎在这个代码级别上的失败只能(可能)解释大约1%的收集样本。这就是我们如何确定问题在于
    sqlite3\u open\u v2
    花费了很长时间
  • 这在
    DELETE
    日记账模式和
    WAL
    上都会发生
  • 对于一个特定的用户来说,似乎在这个问题第一次发生之后,每次连续调用
    sqlite3\u open\u v2
    都要花那么长的时间,直到用户重新启动整个应用程序(可能是机器,无法从我们的数据中判断)
  • 我们正在为
    sqlite3\u open\u v2
    使用以下标志设置(如在Poco中):
sqlite3_open_v2(…,…,SQLITE_open_READWRITE | SQLITE_open_CREATE | SQLITE_open_URI,NULL)

  • 这通常不会发生在应用程序启动时,因此不太可能是由于应用程序未运行时发生的某些事情造成的。这包括导致数据破坏的断电(如中所述,这往往会导致SQLITE_损坏)
  • 尽管我们尝试了不同的方法,但我们始终无法在本地重现此问题:

    • 通过特定日志系统所需的同步,从数据库中写入和读取多个线程
    • 长时间保持SQLite连接打开,同时在DB上正常工作
    • 试图用其他数据(在正常访问数据库时,将/dev/rand(WSL)转储到来自不同进程的多个文件)来重击HDD
    • 试图强制杀毒软件在每次文件访问时扫描数据库(使用Avast进行测试,基本上启用了所有功能,包括“打开时扫描”和“写入时扫描”)
    • 破坏特定日志系统所需的内部同步
    • 调用WinAPI CreateFile时,在DB file上使用所有可能的文件共享选项组合-这会导致问题,但是
      sqlite3\u open\u v2
      总是返回得很快-只是出现了一个错误
    • 对DB文件的随机部分调用WinAPI LockFile(顺便说一句)。复制SQLITE_IOERR的好方法,但是复制讨论的问题没有运气
    • 一些额外的尝试实际拉伸Poco层,并仔细检查我们对代码的静态分析是否正确
  • 我们曾试图在网上寻找类似的问题,但我们找到的任何相关信息都在这里。不过,这似乎不能解释我们的情况,因为并行连接的数量远远超出了我们现有的数量以及典型windows用户的数量(除非有一些我们不知道的利用SQLite的流行应用程序)

  • 这个问题不太可能是由通过网络共享访问db引起的,因为我们将db文件放在
    %appdata%
    中,除非有一些非常标准的windows配置将
    %appdata%
    设置为远程共享
你知道是什么导致了这个问题吗

也许一些关于我们还应该检查什么的提示,或者我们可以从用户那里收集哪些额外的诊断数据有助于查明发生这种情况的真正原因


提前感谢

事实上,我在企业系统上看到了其他sqlite的类似问题,这些系统安装了McAfee病毒扫描,并配置为始终扫描所有内容。我们甚至不时看到访问被拒绝。谢谢你的建议-我会检查这个理论,然后回到这里。@Yester:你确定这个问题了吗?如果是,原因是什么?对不起,但不是真的。我确实排除了McAfee病毒扫描作为根本原因的可能性,但是如果这有帮助的话。帖子没有提到任何类型的泄漏,但是描述中尖叫着连接泄漏和/或内存泄漏(尽管你似乎排除了连接问题)。这篇文章没有提到事务、异常处理等。如果您的DB访问逻辑不可靠。。。即使是一个DB执行异常(如您所述,~%1)也可能导致滚雪球般的问题——可能是它导致了一个故障,导致一个悬空的连接,一个级联或递归的连接,直到最终超时为止。这可能归结于您对连接、事务和异常的管理。