Многократный запрос базы данных одновременно из приложения IOS, вызывающий сбой - PullRequest
0 голосов
/ 03 октября 2019

Я использую MySqlDriver для доступа к реляционной базе данных прямо из моего приложения для iOS. Но если я использую несколько запросов одновременно, это приводит к сбою драйвера. драйвер находится в следующей библиотеке: https://github.com/mcorega/MySqlSwiftNative

код, который я использую:

class ViewController: UIViewController {

    let con = MySQL.Connection()
    override func viewDidLoad() {
        super.viewDidLoad()
        let db_name = "database"

        do{
            try con.open("localhost", user: "root", passwd: "1234")
            try con.use(db_name)
        }
        catch (let e) {
            print(e)
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


    @IBAction func onClickButton(sender: UIButton!){
        DispatchQueue.global(qos: .background).async {
            print("gone")
            let select_stmt = try? self.con.prepare("query")
                    let stRes = try? select_stmt!.query([])
                    if let rr = try? stRes!.readAllRows() {
                        print(rr)
                        if rr!.count > 0{
            //                completion(true, (rr.first!))
                        }else{
            //                completion(true, [[String: Any]]())
                        }
                    }
        }
    }

}

Ответы [ 2 ]

0 голосов
/ 15 октября 2019

Я создал библиотеку поверх SQLite, которая обрабатывает все это. Он называется SundeedQLite

При работе с базами данных вы должны знать одну вещь: вы не можете получить к ней асинхронный доступ.

При этом на onClickButton можно щелкнуть два разапо-быстрому достаточно, чтобы первая операция не была выполнена, поэтому это вызовет проблемы.

Поэтому лучше убедиться, что все обращения к базе данных должны быть синхронными.

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

Или попробуйте мою библиотеку, потому что эти проблемы уже решены.

0 голосов
/ 03 октября 2019

Я обновил ваш код. Пожалуйста, проверьте и дайте мне знать, работает ли он для вас или нет.

@IBAction func onClickButton(sender: UIButton!){
    DispatchQueue.main.async {
    print("Success")
        let select_stmt = try? self.con.prepare("query")
        let stRes = try? select_stmt!.query([])
        if let rr = try? stRes!.readAllRows() {
           print(rr)
           if rr!.count > 0{
        //                completion(true, (rr.first!))
                   }else{
        //                completion(true, [[String: Any]]())
                    }
         }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...