我在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)
}
}
我认为有些地方资源泄漏
1条答案
按热度按时间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/