FMDatabase / SQLite3使用的“打开的文件太多”问题

时间:2017-05-18 14:50:20

标签: xcode macos sqlite fmdb

我在OSX App中使用了SQLite3的FMDatabase包装器。我在数据库中进行了大量的插入操作:

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 :(得分:0)

这是在多线程应用程序中,每次更新/插入行时是否创建并打开db实例?你在某个地方有[db close];吗?

您是否测试了FMDatabaseQueue

答案 1 :(得分:-1)

对于运行数据库的用户,请运行以下命令:

limit maxfiles 4096 16384 

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

如何坚持OS X重新启动取决于OS X的版本。您可以通过搜索自己喜欢的搜索引擎找到它