如何在Vapor中重新连接MySQL数据库?

问题描述 投票:0回答:1

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

如何解决这个问题?

mysql swift vapor server-side-swift
1个回答
0
投票

Vapor 只是让孩子们了解 Web 服务器如何工作的项目。 这并不意味着它用于实时生产服务器。这就是为什么它没有适当的文档。

我已经转向 Laraval PHP,这对于专业服务器来说非常有用。不仅是蒸汽,而且永远不要为软件项目选择不成熟的框架。这些框架被粉丝们过度夸大了。如果您仍然选择,您最终会浪费大量时间并毁掉日子。

© www.soinside.com 2019 - 2024. All rights reserved.