Подтвердить что ты не робот

Является ли поток экземпляров базы данных Sqlite безопасным

У меня есть база данных с некоторыми таблицами. Я хочу обновить таблицы, используя несколько потоков. Я буду использовать тот же экземпляр SQLiteDatabase во всех потоках.

Просьба предложить, правильно ли этот подход. Является ли база данных Sqlite потоковой? Может ли два разных потока одновременно обновлять одну и ту же таблицу для разных наборов значений.

4b9b3361

Ответ 1

[WRONG:] Нет, по умолчанию он не является потокобезопасным. Вы используете методы SQLiteHelper, связанные с блокировкой, для обеспечения безопасности потоков.

[EDIT]: Класс SQLiteDatabase обеспечивает механизм блокировки по умолчанию (см. комментарии), и если вы работаете на многопоточном уровне, вам не нужно рассматривать возможность изменения чего-либо для обеспечения безопасности потока.

Найдите "поток" в этом документе: http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html

И читайте дальше:

Ответ 2

В Android используется механизм блокировки java для обеспечения доступа к базе данных SQLite. Таким образом, если несколько потоков имеют один экземпляр db, он всегда вызывает сериализацию базы данных, и, конечно, база данных является потокобезопасной.

Если мы подтвердим, что мы используем базу данных из одного потока, у нас была возможность отключить внутреннюю блокировку базы данных, вызвав setLockingEnable(false), но этот метод получил устаревший от уровня API 16 и больше не используется. если вы видите реализацию этого метода в классе SQLiteDatabase, вы не найдете там ничего написанного, то есть пустого метода.

public void setLockingEnabled (boolean lockingEnabled)

Этот метод теперь ничего не делает. Не используйте.

Одна вещь, которую мы должны позаботиться об этом, - это сделать один экземпляр вашего вспомогательного класса (то есть, сделав его singleton) и поделиться одним и тем же экземпляром с несколькими потоками и не вызывать close() в базе данных между операциями, иначе вы можете получить следующее исключение:

java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase

Итак, не вызывайте database.close() между доступом к базе данных, база данных будет выполнять внутреннюю работу внутри, когда все операции будут завершены.

Ответ 3

Вы можете управлять, если ваша база данных потокобезопасна или нет setLockingEnabled.

Определите, является ли SQLiteDatabase безопасным потоком, используя блокировки вокруг критических разделов. Это довольно дорого, поэтому, если вы знаете, что ваша БД будет использоваться только одним потоком, вы должны установить значение false. По умолчанию используется значение

Итак, я думаю, что это отвечает на ваш вопрос.

Метод setLockingEnabled обесценивается в уровне API 16

Ответ 4

Если вы это сделаете..

setLockingEnabled (boolean lockingEnabled) Контролируйте, является ли SQLiteDatabase безопасным потоком, используя блокировки вокруг критических разделов.