FMDatabase/SQLite3使用的“Too many files open”问题

6

我在我的OSX应用程序中使用FMDatabase封装器来操作SQLite3。我需要频繁地向数据库中插入数据:

FMResultSet *results;
results= [db executeQuery:@"select count(*) from `items` where key = ?",[keyPath lowercaseString],nil];

while([results next])
{
    if([results unsignedLongLongIntForColumnIndex:0]>0){
        updateOperation=TRUE;
    }
}
[results close];

if(updateOperation){

    [db executeUpdate:@"update `items` set OSXsize=?,OSXOsize=?, OSXDate=?, UUID=?,sourceFile=?,tombStone=0,SandBoxBookMark=?,songname=?,albumartist=? where key=?",
     size,originalSize, convertedDate,UUID,sourcePath,bookmark,fileName,albumArtist,[keyPath lowercaseString] , nil];
}
else
{
    [db executeUpdate:@"insert into `items`(key,filepath, OSXsize, OSXOsize, OSXdate,UUID,sourceFile,tombStone,SandBoxBookMark,songname,albumartist) values(?,?,?,?,?,?,?,0,?,?,?)",
     [keyPath lowercaseString], dapPath, size,originalSize, convertedDate,UUID,sourcePath,bookmark,fileName,albumArtist, nil];
}

我只打开了一次数据库,但是在应用程序活动监视器中随着应用程序的进行,我看到了4725个以上的文件句柄已被附加:

/Users/userA/Library/Containers/com.map-pin.Dapper/Data/Library/Application Support/com.map-pin.Dapper/dapperright.sqlite
15
16
...
4724
4725
2个回答

0
这是在多线程应用程序中吗?每次更新/插入行时,您是否创建和打开一个db实例?您是否在某个地方使用了[db close];
您测试过FMDatabaseQueue吗?

使用FMDatabaseQueue打开了一些日志记录,揭示了一个未正确关闭的查询结果集。 - JeremyLaurenson

-1
针对运行数据库的用户,请执行以下命令:
limit maxfiles 4096 16384 

然后重新启动数据库。现在应该能够处理16k个文件。

如何在OS X重新启动后保留此设置取决于OS X的版本。您可以通过在您喜欢的搜索引擎中搜索来找到它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接