2017-09-13 44 views

回答

1

我寧願說比池等高效再利用的連接。以完美的MySQL的例子:

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) 
} 

通過使用Threading.Lock(),您可以輕鬆地排隊的所有查詢到一個連接,並最大限度地提高效率 - 快速,原子,有序,共享和單。

如果堅持,你可以創建一個有限數量的連接到一個數組,每個連接保持一個鎖來平衡,比如說一個線程連接池,所以我相信這個平衡的解決方案可以在沒有任何特殊模塊完美本身:

struct MySQLPool { 
    let mysql = MySQL() 
    let lock = Threading.Lock() 
} 
var pool: [MySQLPool] = [] 
for _ in 0 ..< 32 { 
    pool.append(YourNewConnection) 
} 
+0

謝謝你的回答 –

1

Here是實現從MySQL數據庫中獲取的存儲庫,它返回使用完美的框架取結果JSON。請確保您根據數據庫設置更改database.swift文件中的數據庫配置和查詢。

+0

感謝您的回答 –

+0

歡迎您:) –