JDBC-соединение неожиданно закрывается - PullRequest
0 голосов
/ 15 мая 2019

Время от времени я получаю следующую ошибку и не могу понять, почему:

org.jooq.exception.DataAccessException: SQL [select "public"."RefreshTokens"."userId" from "public"."RefreshTokens" where "public"."RefreshTokens"."token" = ?]; This connection has been closed.

Вот самая важная часть трассировки стека:

      {
        "class" : "org.postgresql.jdbc.PgConnection",
        "method" : "checkClosed",
        "file" : "PgConnection.java",
        "line" : 783
      }, {
        "class" : "org.postgresql.jdbc.PgConnection",
        "method" : "prepareStatement",
        "file" : "PgConnection.java",
        "line" : 1680
      }, {
        "class" : "org.postgresql.jdbc.PgConnection",
        "method" : "prepareStatement",
        "file" : "PgConnection.java",
        "line" : 371
      }, {
        "class" : "org.jooq.impl.ProviderEnabledConnection",
        "method" : "prepareStatement",
        "file" : "ProviderEnabledConnection.java",
        "line" : 109
      }, {
        "class" : "org.jooq.impl.SettingsEnabledConnection",
        "method" : "prepareStatement",
        "file" : "SettingsEnabledConnection.java",
        "line" : 73
      }, {
        "class" : "org.jooq.impl.AbstractResultQuery",
        "method" : "prepare",
        "file" : "AbstractResultQuery.java",
        "line" : 239
      }, {
        "class" : "org.jooq.impl.AbstractQuery",
        "method" : "execute",
        "file" : "AbstractQuery.java",
        "line" : 322
      }, {
        "class" : "org.jooq.impl.AbstractResultQuery",
        "method" : "fetchLazy",
        "file" : "AbstractResultQuery.java",
        "line" : 393
      }, {
        "class" : "org.jooq.impl.AbstractResultQuery",
        "method" : "fetchLazy",
        "file" : "AbstractResultQuery.java",
        "line" : 380
      }, {
        "class" : "org.jooq.impl.AbstractResultQuery",
        "method" : "fetchOne",
        "file" : "AbstractResultQuery.java",
        "line" : 545
      }, {
        "class" : "org.jooq.impl.SelectImpl",
        "method" : "fetchOne",
        "file" : "SelectImpl.java",
        "line" : 2879
      }

Я использую JOOQ (3.11.11) с Postgres (42.2.5.jre7), и я создаю свое соединение и DSLContext вот так:

val conn = DriverManager.getConnection(
            config.databaseUrl, config.databaseUser, config.databasePassword)
DSL.using(conn, SQLDialect.POSTGRES_10)

Я думал, что JOOQ будет управлять соединениями для меня, и мне не нужно открывать / открывать / закрывать их вручную. Я должен использовать что-то вроде DataSource вместо DriverManager для JOOQ для автоматической обработки состояния соединения? И было бы замечательно, если бы кто-то мог сказать мне, почему на самом деле разрывается соединение.

1 Ответ

1 голос
/ 15 мая 2019

Хотя JOOQ также может в некоторой степени управлять вашими подключениями (используя DSL#using(String url, String username, String password), он обычно делегирует базовый ConnectionProvider или DataSource.

IMO, лучший подход - полностью отделить JOOQ (как исполнитель с использованием соединений) и ваш менеджер соединений (как менеджер , который наблюдает за открытием и закрытием соединения).

Один из способов сделать этоиспользуя DataSource, org.jooq.Configuration#derive(DataSource dataSource) и DSL#using(Configuration configuration) следующим образом:

javax.sql.DataSource ds = ...; // initialize DataSource
org.jooq.Configuration configuration = Configuration.derive(ds);
DSLContext dslContext = DSL.using(configuration);

Record r = dslContext.selectFrom(...).where.(...).fetchOne();

См. также DSL javadocs , а также Configuration javadocs .как этот ответ.

...