Prowadzę serię zapytań w całym cyklu życia mojej aplikacji.Kiedy otworzyć i zamknąć SQlite DB w cyklu życia systemu iOS?
Obecnie używam FMDB (wrapper Objective-C wokół interfejsu API Sqlite C), a ja otwieram i zamykam przed każdym zapytaniem.
FMDatabase * db = [FMDatabase databaseWithPath:pathToMyDB];
[db open]
FMResultSet * s = [db executeQuery:@"SELECT * FROM myTable"];
// Use FMResultSet
[db close];
Otwórz i zamknij spust fopen()
i fclose()
niżej, więc wierzę mogę zdobyć siłą rzeczy wygraną poprzez utrzymywanie bazy otwarte.
Uważam jednak, że tymczasowe obiekty będą się budować, co może prowadzić do problemów z pamięcią. Closing the database usuwa obiekty tymczasowe.
- Kiedy należy otworzyć i zamknąć połączenie z bazą danych? (np. aplikacja wprowadziła backgound?)
- Czy powinienem uruchomić VACUUM w sytuacjach z małą ilością pamięci?
Dziękuję za odpowiedź. Czy jesteś w 100% pewien, że baza danych nie tworzy i/lub nie zatrzymuje żadnych obiektów? Prawdopodobnie masz rację, ale ta dokumentacja mówi: "zwróć SQLITE_OK, jeśli obiekt sqlite3 zostanie pomyślnie zniszczony ** i wszystkie powiązane zasoby zostaną zwolnione **" http://www.sqlite.org/c3ref/close.html – Robert
Myślę, że powiązane zasoby odnoszą się do samego połączenia i kilku innych rzeczy, które są potrzebne, aby uzyskać do niego dostęp. Jak już powiedziałem, nie jestem pewien, czy serwerowe bazy danych to robią. Z drugiej strony nie trzeba ich otwierać, per se. Zrób tak jak powiedziałem, przetestuj go w następujący sposób: w oddzielnej otwartej bazie danych klasy, wykonuj absurdalną ilość zapytań (podczas oglądania pamięci), a następnie zamknij ją. Powinno być oczywiste, co się dzieje. Jeśli zachowa jakiś obiekt, zobaczysz, że pamięć rośnie, aż do awarii aplikacji, jeśli nie wszystko powinno pozostać przy względnie stałym przydzielaniu pamięci. To najprostszy sposób, aby się upewnić. – skytz