У меня есть серверная часть приложения на php. Но недавно я создал такой же бэкэнд на Quarkus и развернул его на кубернетах с базой данных MYSQL. Я направляю половину пользователей на бэкэнд php, а половину на qaurkus из приложения. PHP бэкэнд работает нормально, но есть проблема с бэкэндом quarkus, он зависает через несколько часов, а задержка запроса увеличивается более чем на одну минуту, а иногда и таймаут. После проверки некоторых стеков я в основном вижу, что он застрял в getConnection в источнике данных. Я подаю в суд на agroal. Это не проблема с базой данных, потому что пока я проверяю приложение с php, оно работает нормально без каких-либо проблем или задержек. Также я пробовал увеличивать и уменьшать минимальный / максимальный размер пула, но все еще та же проблема. Я поделюсь своей структурой использования quarkus, agroal и jooq с mysql. Я думаю, проблема в этом.
Я использую kotlin, а DSLContext - это объект, который является stati c.
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)
}
}
Я думаю, что кое-где утечка ресурсов