@Staspost

Как оптимизировать работу с БД при возникновении ошибки «The database file is locked»?

Добрый день!
Когда начал писать проект, думал ограничусь парой подключений к БД SQLite - загрузить и сохранить настройки, поэтому писал подключение и закрытие соединения упрощенно, прямо в методах. Затем проект разрастался и я думал "Ну ладно, еще один метод, не переписывать же из-за него..." ))
Но таких "ну еще один" методов оказались в результате десятки в одном классе, в результате они, похоже, мешают друг другу при работе и все-таки придется переписывать.))
Вчера прозвенел первый звоночек - проект подвис и выдал ошибку "The database file is locked" на очередном методе.
Я обернул обращение к БД в Invoke и все заработало. Сегодня добавились еще несколько методов и на каждом из них выдается та же ошибка.
Методы выглядят примерно так:
private void clearActive()
    {
        try
        {
            path = Application.dataPath + "/StreamingAssets/db.bytes";
            scriptConnection.dbconnection = new SqliteConnection("URI=file:" + path);
            scriptConnection.dbconnection.Open();
            if (scriptConnection.dbconnection.State == ConnectionState.Open)
            {
                scriptConnection.cmd = new SqliteCommand();
                scriptConnection.cmd.Connection = scriptConnection.dbconnection;
                scriptConnection.cmd.CommandText = "UPDATE progress SET active = 0 WHERE active = 1";
                scriptConnection.cmd.ExecuteNonQuery();
                scriptConnection.dbconnection.Close();               
            }
            else
            {
                Debug.Log("Error connection");
            }
        }
        catch (Exception ex)
        {
            Debug.Log(ex);
        }
    }

Собственно вопрос, как это лучше всего оптимизировать? Подключение вынести в отдельный статический класс (не пробовал пока так сделать)? Может еще что-то?
  • Вопрос задан
  • 70 просмотров
Решения вопроса 2
Morpheus_God
@Morpheus_God
Почитайте про Lock.
Здесь
И здесь
Ответ написан
Варианты:
1. Работать с базой данных через отдельный класс
2. При использовании многопоточности применять мьютексы для доступа к базе данных
3. Можно прейти на полноценную субд, например sqlserver, mysql
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы