Структура кваркуса с помощью jooq
У меня есть серверная часть приложения на php. Но недавно я создал такой же бэкэнд на Quarkus и развернул его на кубернетах с базой данных MYSQL. Я направляю половину пользователей на бэкэнд php и половину на qaurkus из приложения. Бэкэнд PHP работает нормально, но у него есть проблема с бэкэндом quarkus, он завис через несколько часов, а задержка запроса увеличивается более чем на одну минуту, а иногда и таймаут. Хорошо, после проверки некоторых стеков в основном я вижу, что он застрял в 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 при запуске приложения как singleton, а затем устанавливаю его экземпляр в объекте 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 ответ
Рассмотрите возможность внедрения компонента DataSource вместо использования DSLContext и разрешения пулу соединений управлять соединениями.
Если вы еще не используете его, я предлагаю использовать расширение jooq-quarkus, которое можно найти по адресу:
https://github.com/quarkiverse/quarkus-jooq
Кроме того, ознакомьтесь с этой статьей о предотвращении утечек и использовании DataSource от jooq:
https://blog.jooq.org/how-to-prevent-jdbc-resource-leaks-with-jdbc-and-with-jooq/