kotlin quarkus 与Jooq的结构

tf7tbtn2  于 2023-05-07  发布在  Kotlin
关注(0)|答案(1)|浏览(100)

我在PHP上有应用程序后端。但最近我在Quarkus上创建了相同的后端,并使用数据库MYSQL将其部署在Kubernetes上。我在php后端路由一半的用户,在app路由一半的qaurkus。PHP后端工作正常,但quarkus后端有问题,它在几个小时后卡住,请求延迟增加超过一分钟,有时超时。好吧,在检查了一些堆栈后,我发现它卡在了datasource中的getConnection上,我正在起诉agroal。它不是数据库问题,因为同时,如果我检查应用程序与PHP是工作正常,没有任何问题或延迟。此外,我尝试增加和减少最小/最大池大小,但仍然是相同的问题。我将分享我使用quarkus,agroal和jooq与mysql的结构。我认为问题在于此。
我使用的是Kotlin,DSLContext是一个静态的对象。
Application.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)
    }
}

我认为有些地方资源泄漏

whhtz7ly

whhtz7ly1#

考虑注入DataSourcebean而不是使用DSLContext,并允许连接池管理连接。
如果你还没有使用它,我建议你使用jooq-quarkus扩展,可以在下面找到:
https://github.com/quarkiverse/quarkus-jooq
另外,请参考这篇关于防止泄漏和使用jooq的DataSource的文章:
https://blog.jooq.org/how-to-prevent-jdbc-resource-leaks-with-jdbc-and-with-jooq/

相关问题