【问题标题】:How do I refresh the db connection using JOOQ如何使用 JOOQ 刷新数据库连接
【发布时间】:2017-07-19 19:35:38
【问题描述】:

我有一个用例,我们必须用集群中一个节点上对另一个节点所做的更改静默替换数据库。另一个节点不应重新启动进程,但应刷新数据库连接,以便在替换数据库文件(SQLite)时获得新的更改。有没有办法在 JOOQ 中做到这一点?我还没有找到任何相关的 API 来刷新数据库连接。

我尝试执行以下操作,但遇到了死锁 -

public static void closeDBConnection(Configuration config) {
    try {
        Connection connection = getDBConnection(config);
        config.connectionProvider().release(connection);

        if (!connection.isClosed()) {
            connection.close();
        }
    } catch(SQLException ex) {
    //   throw new ReAttachException();
    }
}

public static Connection getDBConnection(Configuration config) {
    return config.connectionProvider().acquire();
}

在调用方法中-

private void reattach(FooRecord record, Configuration config) {
    record.detach();

    DBUtils.closeDBConnection(config);
    DBUtils.getDBConnection(config);

    record.attach(config);
}

【问题讨论】:

    标签: java sql jdbc jooq


    【解决方案1】:

    jOOQ 不会为您管理连接,您必须自己或使用 JDBC 驱动程序或连接池的功能来管理。

    特别是,在您当前的尝试中,您调用了 jOOQ 的 SPI ConnectionProvider,您不应该调用它。 SPI 旨在供您实施 并供 jOOQ 使用 和调用。这意味着您的实现应该已经处理了连接替换,并且 jOOQ 不应该注意到任何相关内容:

    class MyConnectionProvider implements ConnectionProvider {
        @Override
        public Connection acquire() {
            // Do your own reconnection magic here
            connection = ...
    
            // Pass this connection to jOOQ. jOOQ should assume it will always work.
            return connection;
        }
    
        @Override
        public void release(Connection connection) {
            // Close or return to the pool, etc.
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-05
      • 1970-01-01
      相关资源
      最近更新 更多