2017-08-09 47 views
0

使用Perfect/mySQL(https://github.com/PerfectlySoft/Perfect-MySQL),我所見過的例子表明,您不能跨多個連接重用單個數據庫連接。也就是說,您需要每個HTTP請求一個數據庫連接。完美/ Swift mySQL你必須有一個單一的數據庫連接每個請求?

例子我見過在這裏: https://github.com/PerfectlySoft/Perfect-MySQL 這裏: https://perfect.org/docs/MySQL.html

這是正確的?您必須使用Perfect/mySQL爲每個請求創建一個新的數據庫連接?

回答

1

,您仍然可以重複使用多次的聯繫,但請注意,連接不是線程安全的,所以必須在同一個連接

import MySQL 
import PerfectThread 
#if os(Linux) 
import Glibc 
#else 
import Darwin 
#endif 

let mysql = MySQL() 
let lock = Threading.Lock() 
var jobs = 10 

func now(_ id: Int) { 
    print("Job Now #", id) 
    lock.doWithLock { 
    let x = mysql.query(statement: "SELECT now() as time") 
    guard x, let y = mysql.storeResults(), 
    let row = y.next() else { 
    print(mysql.errorMessage()) 
     return 
    } 
    print(row[0] ?? "Now() FAILED") 
    y.close() 
    jobs -= 1 
    } 
} 

func user(_ id: Int) { 
    print("Job Usr #", id) 
    lock.doWithLock { 
    let x = mysql.query(statement: "select User from user") 
    guard x, let y = mysql.storeResults(), 
     let row = y.next() else { 
     print(mysql.errorMessage()) 
     return 
    } 
    print(row[0] ?? "User() FAILED") 
    y.close() 
    jobs -= 1 
    } 
} 

_ = mysql.setOption(.MYSQL_SET_CHARSET_NAME, "utf8mb4") 
guard mysql.connect(host: "127.0.0.1", user: "root", password: "your pass", db: "mysql") else { 
    print(mysql.errorMessage()) 
    exit(0) 
} 

jobs = 10 
for id in 0 ..< 5 { 
    Threading.dispatch { 
    now(id) 
    } 
    Threading.dispatch { 
    user(id) 
    } 
} 

while jobs > 0 { 
    sleep(1) 
} 

mysql.close() 

在這個例子上添加線程鎖,兩個功能共享相同的連接並運行幾次。沒關係。但是,如果每個函數都在單獨的線程中運行,則會導致失敗。

+0

感謝您對此的迴應。我不知道你對Perfect項目的參與,但是你知道是否有計劃讓這個接口是線程安全的嗎?爲了服務器的目的,我希望只打開一個連接,我認爲這會比根據REST請求打開一個新連接更有效率。 –

+0

實際上,您不必等待來自Perfect的任何更新 - 添加線程鎖定是非常容易的,請檢查下面的要點,您可以安全地在同一連接上使用多個線程: https://gist.github.com/RockfordWei/6f7ab9d66e975ce83b09db5b21c2d726 – PerfectlyRock

相關問題