5

我在 php 上有应用程序后端。但最近我在 Quarkus 上创建了相同的后端,并将其部署在带有数据库 MYSQL 的 kubernetes 上。我在 php 后端路由一半用户,从应用程序路由一半 qaurkus。PHP 后端工作正常,但 quarkus 后端出现问题,它在几个小时后卡住,请求延迟增加超过一分钟,有时甚至超时。好吧,在检查了一些堆栈之后,我发现它卡在了数据源中的 getConnection 上,我正在起诉 agroal。它不是数据库问题,因为与此同时,如果我使用 php 检查应用程序,它工作正常,没有任何问题或延迟。我也尝试增加和减少最小/最大池大小,但仍然是同样的问题。我将分享我在 mysql 中使用 quarkus、agroal 和 jooq 的结构。我认为问题在于那个。

我正在使用 kotlin,而 DSLContext 是静态对象。

应用程序.kt

@ApplicationScoped
class AppLifecycleBean {
    @Inject
    lateinit var dsl: DSLContext
    @Inject
    lateinit var launchMode: LaunchMode

    fun onStart(@Observes ev: StartupEvent?) {
        DBHelper.init(dsl)
    }

    fun onStop(@Observes ev: ShutdownEvent?) {
    }

}

DBHelper.kt

object DBHelper {
    lateinit var db: DSLContext
    private set

    fun init(db: DSLContext){
        this.db = db
    }
}

如您所见,我在应用程序开始时将 JOOQ 初始化为单例,然后在 DBHelper 的对象中设置其实例以继续使用它而不是创建新的。所以我怀疑这可能是我需要每次通过注入创建新的 DSLContet 实例的问题。然后我创建了模型来访问这样的数据库

    open class Model {
        protected val db
        get() = DBHelper.db
    }
object UserModel: Model() {
   fun getUserbyId(id: Int){
       db.selectFrom.......
   }
}

最后我正在访问这样的模型

@Path("/mobile/user")
@Produces(MediaType.APPLICATION_JSON)
class UserApiController() : Controller() {
    @GET
    @Path("/get_profile")
    fun getProfile(
            @QueryParam("user_id") userId: Int
    ): Response {
        val user = UserModel.getbyId(userId)
        return Response.success(data = user)
    }
}

我认为有些地方资源泄漏

4

0 回答 0