在我们的单元测试套件中,我们创建并销毁了大量使用":memory:"
路径的SQLite数据库。偶尔,只有在iOS模拟器上运行时,这些数据库的创建才会失败并带有相当神秘的信息:
Database ":memory:": unable to open database file
99%的时间,这些请求成功。 (在此故障发生后,同一测试运行中的后续测试通常会成功。)但是,当您在自动构建验收测试中使用此项时,您需要100%。
我们已经检测了内存消耗(在正常范围内)和磁盘空间可用性(20GB +可用)。
有什么想法吗?
更新:根据理查德的建议,捕获这种情况并进行额外的记录。这是日志输出:
SQLITE ERROR: (28) attempt to open "/Users/xxx/Library/Developer/CoreSimulator/Devices/CF762060-7D23-4C79-A466-7F20AB6233E7/data/Containers/Data/Application/582E1ED0-81E0-4CC7-A6F6-DBEBC101BBE8/tmp/etilqs_1ghbf1MSTa8ilSj" as
SQLITE ERROR: (14) cannot open file at line 30595 of [f66f7a17b7]
SQLITE ERROR: (14) os_unix.c:30595: (17) open(/Users/xxx/Library/Developer/CoreSimulator/Devices/CF762060-7D23-4C79-A466-7F20AB6233E7/data/Containers/Data/Application/582E1ED0-81E0-4CC7-A6F6-DBEBC101BBE8/tmp/etilqs_1ghbf1MST
答案 0 :(得分:2)
我注意到即使是:memory:数据库也会在磁盘上创建一个临时表。 unix系统的临时文件由Prng构建,因此如果同时创建大量临时文件,则名称冲突的概率非零。或者,如果磁盘已满,则创建可能会失败。或者,如果由于某种原因无法访问unix临时目录,因为它已被删除或对其的权限无效。
例如,我通过将这些命令行参数添加到llvc-gcc,在sqlite3命令行中打开了几个记录器:-DSQLITE_DEBUG_OS_TRACE = 1 -DSQLITE_TEST = 1 -DSQLITE_DEBUG = 1然后我观察到正在创建一个临时文件从命令行使用此SQL:
$ ./sqlite3 SQLite版本3.8.8.2 2015-01-30 14:30:45 输入" .help"用法提示。 连接到瞬态内存数据库。 使用"。打开FILENAME"重新打开持久数据库。 源码>创建临时表t(x); OPENX 3 / var / folders / nf / l1cw8sn1707b73zy5nqycrpw0000gn / T // etilqs_fvwR6KbMm518S4w 01002 打开3
写3 512 0 0 OPENX 4 / var / folders / nf / l1cw8sn1707b73zy5nqycrpw0000gn / T // etilqs_OJJJ1lrTtQIFnUO 05402 OPEN 4
WRITE 4 1024 0 0 WRITE 4 1024 1024 0 写3 28 0 0 源码>
答案 1 :(得分:1)
没有想法。但也许如果你打开error and warning log它会提供一些线索。