Структура кваркуса с помощью jooq - PullRequest
5 голосов
/ 18 июня 2020

У меня есть серверная часть приложения на 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)
    }
}

Я думаю, что кое-где утечка ресурсов

...