SQLite偶尔无法创建:内存:数据库

时间:2015-03-03 17:58:56

标签: ios sqlite xcode6

在我们的单元测试套件中,我们创建并销毁了大量使用":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

2 个答案:

答案 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它会提供一些线索。