簡體   English   中英

JDBC連接意外關閉

[英]JDBC connection closes unexpectedly

我不時收到以下錯誤,我不知道為什么:

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

這是stacktrace中最重要的部分:

      {
        "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如下方式創建連接和DSLContext

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

我以為JOOQ會為我管理連接,而我不必手動重新打開/打開/關閉它們。 我是否應該使用DataSource代替DriverManager for JOOQ來自動處理連接狀態? 如果有人能告訴我為什么實際上斷開連接,那就太好了。

盡管JOOQ也可以某種程度上管理您的連接(使用DSL#using(String url, String username, String password) ,但它通常委托給基礎ConnectionProviderDataSource

IMO,最好的方法是將JOOQ (作為使用連接的執行者 )和您的連接管理器(作為監督連接打開和關閉的管理器 )完全分離。

一種方法是使用DataSourceorg.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 javadocsConfiguration javadocs答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM