java - JDBC 连接意外关闭

标签 java postgresql jdbc jooq

我时常收到以下错误,但我不知道原因:

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 来自动处理连接状态? 如果有人能告诉我连接实际上被断开的原因,那就太好了。

最佳答案

虽然JOOQ也可以在某种程度上管理您的连接(使用DSL#using(String url, String username, String password),但它通常委托(delegate)给底层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 javadocs以及 Configuration javadocs以及this回答。

关于java - JDBC 连接意外关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56145475/

相关文章:

sql - 如何在不使用 CASE WHEN 的情况下将 GROUP BY 作为参数?

java - 使用单个 JDBC Statement 对象执行多个查询

java - Hibernate 4 按属性查找记录

java - 是否有一个使用 Clojure 的实际项目可以利用多核系统,我可以看一下?

java - 使用 Spring 授权标记检查用户是否登录时出错?

java - (Java) 同时发布 Web Service Endpoint 和 Http Server?

postgresql - 模式的转储结构和数据

sql - 删除 SQL 结果中的 SUM 列

java.sql.SQLData - Oracle 对象映射问题

java - 如何使用 JDBC 访问 Oracle 表统计信息,特别是 NUM_ROWS 和 AVG_ROW_LEN?