2017-02-28 8 views
0

クラスタ内のあるノードの変更を他のノードにサイレントに置き換える必要があるユースケースがあります。もう一方のノードはプロセスを再起動するべきではありませんが、dbファイル(SQLite)が置き換えられたときに新しい変更が得られるようにDB接続を更新する必要があります。 JOOQでこれを行う方法はありますか? DB接続をリフレッシュするための関連するAPIが見つかりませんでした。JOOQを使用してDB接続をリフレッシュするには

私は、次の操作を実行しようとしたが、私はデッドロックを取得 - 呼び出しメソッドでは

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(); 
} 

を - jOOQはあなたのためのあなたの接続を管理しません

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

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

    record.attach(config); 
} 

答えて

1

、あなたがする必要がありますそれを自分で行うか、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. 
    } 
} 
関連する問題