Wil*_*iam 5 jooq quarkus agroal
我在 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?) {
}
}
Run Code Online (Sandbox Code Playgroud)
数据库助手.kt
object DBHelper {
lateinit var db: DSLContext
private set
fun init(db: DSLContext){
this.db = db
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我在应用程序开始时将 JOOQ 初始化为单例,然后在 DBHelper 中的对象中设置其实例以继续使用它而不是创建新的。所以我怀疑这可能是我每次都需要通过注入来创建 DSLContet 的新实例的问题。然后我创建了模型来访问这样的数据库
open class Model {
protected val db
get() = DBHelper.db
}
object UserModel: Model() {
fun getUserbyId(id: Int){
db.selectFrom.......
}
}
Run Code Online (Sandbox Code Playgroud)
最后我正在访问这样的模型
@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)
}
}
Run Code Online (Sandbox Code Playgroud)
我认为有些地方资源泄漏
考虑注入 DataSource bean 而不是使用 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/