我在 Ubuntu 中使用 Swift 在服务器端后端使用 Vapor 框架。在完成 80% 的项目时,该框架不会自动重新连接数据库。我只需要至少手动重新连接数据库的解决方案。最坏的情况下,客户端演示上的数据库会自动关闭。因为这个,我所有的工作都毁了。我在下面尝试过,但它不起作用。我真的很沮丧,如果没有 db_reconnect 函数,整个工作和整个框架都是垃圾。我必须搬去 Laravel。
我已将数据库存储在一个类中,该类通常用于从
configure.swift
上的数据库进行查询
app.databases.use(.mysql(configuration: .prod), as: .mysql)
do {
try await app.db.withConnection({ database in
Database.initialize(database)
})
} catch {
fatalError("Unable to connect database")
}
但是,有时查询结果会出现数据库断开连接错误。因此,我尝试使用之前初始化的相同数据库重新连接数据库。我在控制台中连续打印出“已连接”,这意味着数据库实际上未连接。这就是为什么在执行一些查询后它会来到这个函数。
private func connect_db(_ completionHandler:@escaping(Error?) -> Void){
print("Reconnecting Database....")
if let db = self.db as? FluentKit.Database {
Task.detached(priority: .userInitiated) {
do {
try await db.withConnection({ _ in
print("Connected")
completionHandler(nil)
})
} catch {
print("Unable to connect!")
completionHandler(error)
}
}
} else {
completionHandler(SERVER_ERROR("Invalid DB", info: "The Database isn't Database object", code: 28))
}
}
尝试2:
private func connect_db(_ completionHandler:@escaping(Error?) -> Void){
print("Reconnecting Database....")
Task.detached(priority: .userInitiated) {
do {
try await kAPI.app.db.withConnection { database in
Database.initialize(database)
print("Connected")
completionHandler(nil)
}
} catch {
completionHandler(error)
}
}
}
我在这个功能上使用了
connect_db
func query(_ query: String, with continuation: CheckedContinuation<[MySQLRow]?, Error>) {
self.db.query(query).whenComplete { result in
switch result {
case .success(let rows):
if rows.isEmpty {
continuation.resume(returning: nil)
} else {
continuation.resume(returning: rows)
}
case .failure(let error):
let error = error as NSError
print("Error: \(error)")
if error.code == 11 { // Disconnected
self.connect_db { error in
if let error = error {
continuation.resume(throwing: error)
} else {
self.query(query, with: continuation)
}
}
} else {
continuation.resume(throwing: error)
}
}
}
}
如何解决这个问题?
Vapor 只是让孩子们了解 Web 服务器如何工作的项目。 这并不意味着它用于实时生产服务器。这就是为什么它没有适当的文档。
我已经转向 Laraval PHP,这对于专业服务器来说非常有用。不仅是蒸汽,而且永远不要为软件项目选择不成熟的框架。这些框架被粉丝们过度夸大了。如果您仍然选择,您最终会浪费大量时间并毁掉日子。