2017-08-09 17 views
0

Perfect/mySQL(https://github.com/PerfectlySoft/Perfect-MySQL)では、複数の接続間で単一のデータベース接続を再利用することはできません。つまり、HTTP要求ごとに1つのデータベース接続が必要です。私が見てきたPerfect/Swift mySQLを使用すると、リクエストごとに1つのデータベース接続が必要ですか?

例はここにある: https://github.com/PerfectlySoft/Perfect-MySQL 、ここで: https://perfect.org/docs/MySQL.html

この権利はありますか? Perfect/mySQLでリクエストごとに新しいdb接続を作成する必要がありますか?

答えて

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

関連する問題