0

Perfect/mySQL ( https://github.com/PerfectlySoft/Perfect-MySQL ) では、私が見た例では、単一のデータベース接続を複数の接続で再利用できないことが示唆されています。つまり、HTTP 要求ごとに 1 つのデータベース接続が必要です。

私が見た例はここにあります: https://github.com/PerfectlySoft/Perfect-MySQL とここ: https://perfect.org/docs/MySQL.html

これは正しいですか?Perfect/mySQL を使用して、リクエストごとに新しい db 接続を作成する必要がありますか?

4

1 に答える 1

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

この例では、両方の関数が同じ接続を共有し、数回実行されています。それで大丈夫です。ただし、各関数が別のスレッドで実行されていると、エラーが発生します。

于 2017-08-15T13:37:26.300 に答える