Влияет ли открытие sqlite-соединения для каждого запроса на производительность? Это обязательно для поддержки многопоточности? - PullRequest
0 голосов
/ 13 февраля 2012

Я планирую использовать конструктор target-c-sql-query из ziminji в проекте для iPhone и iPad.Эта библиотека поддерживает многопоточность, как мне нужно.Первоначально я делал свой проект с использованием Core Data, но производительность сильно ухудшается, когда объем данных сильно увеличивается.Например, когда мне нужно удалить все (сто тысяч строк), это занимает много времени, что имеет смысл из-за объектно-ориентированного слоя.Прямой доступ к базе данных намного быстрее.

Я посмотрел код библиотеки и заметил, что каждый раз, когда я запрашиваю базу данных, она открывает соединение с базой данных.Разве это не медленно?Не будет ли быстрее поддерживать соединение с базой данных открытым, пока приложение активно?Или было бы проблемой реализовать его с поддержкой многопоточности?

Ответы [ 2 ]

0 голосов
/ 12 апреля 2012

Библиотека Objective-C SQL Query Builder для SQLite предлагает три способа открытия соединения, как указано в ее Wiki :

// (Alternative #1)
ZIMDbConnection *connection = [[ZIMDbConnectionPool sharedInstance] connection: @"live"];
NSArray *records = [connection query: @"SELECT * FROM Customer;"];

// (Alternative #2)
ZIMDbConnection *connection = [[ZIMDbConnection alloc] initWithDataSource: @"live"];
NSArray *records = [connection query: @"SELECT * FROM Customer;"];
[connection close];

// (Alternative #3)
NSArray *records = [ZIMDbConnection dataSource: @"live" query: @"SELECT * FROM Customer;"];

Первые дваальтернативы позволяют соединению оставаться открытым.На самом деле, это и есть цель пула соединений с базой данных.С пулом соединений с базой данных вам не нужно беспокоиться об открытии и закрытии соединения, потому что класс управляет этим для вас;тогда как, во втором варианте вы управляете соединением.В третьем варианте это просто быстрый способ открыть соединение, запросить, а затем закрыть соединение в одной строке кода.

Если вы собираетесь использовать многопоточность, вам потребуетсяиспользуйте либо первый, либо второй вариант.Если вы выбрали второй вариант, создайте переменную экземпляра в своем классе и откройте соединение, а затем запустите свои потоки.После завершения работы всех потоков закройте соединение ... в противном случае просто оставьте его открытым.

0 голосов
/ 13 февраля 2012

Открытие нового соединения в SQLite - это не что иное, как открытие нового соединения с удаленной базой данных.Поддержание постоянного открытого соединения, вероятно, будет быстрее (возможно, за счет блокировки файла базы данных), но это вряд ли приведет к значительным проблемам с производительностью.Даже если открытие соединения занимает время, фактический анализ запроса и выполнение самой команды займут больше времени.

И да, вы всегда должны хранить свои команды SQLite в определенном потоке.Самый простой способ обеспечить это - сериализовать все в одном потоке с помощью специально созданной очереди отправки GCD (глобальные очереди параллельны и рискуют запустить их одновременно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...