有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JDBC连接意外关闭

我不时会遇到以下错误,我不知道为什么:

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,如下所示:

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

我认为JOOQ会为我管理连接,我不必手动重新打开/打开/关闭它们。我是否应该使用类似于DataSource而不是DriverManager的东西来让JOOQ自动处理连接状态? 如果有人能告诉我为什么会断开连接,那就太好了


共 (1) 个答案

  1. # 1 楼答案

    虽然JOOQ也可以在某种程度上管理您的连接(使用DSL#using(String url, String username, String password)),但它通常会委托给底层的ConnectionProviderDataSource

    在我看来,最好的方法是完全解耦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 javadocs以及Configuration javadocsthis的答复