sql >> データベース >  >> RDS >> Mysql

DropwizardとJDBIを使用して、複数のスキーマでデータベースにクエリを実行しますか?

    これを行う理想的な方法は、リクエストからスキーマ関連情報をキャプチャしてThreadLocalに保存し、接続がリクエストされるたびにスキーマを設定することです。残念ながら、このアプローチを試したところ、setSchemaメソッドがまだドライバーに実装されていないことがわかりました。しかし、これを解決する別の方法(ハック)を見つけました。JDBIは、この問題を解決するためにここで使用できるステートメントLocatorを提供しています。

    クエリパラメータでスキーマ名を送信するとします。ジャージリクエストフィルタを使用してスキーマ名を取得できます。

    public class Schema {
        public static ThreadLocal<String> name = new ThreadLocal<>();
    }
    
    
    public class SchemaNameFilter implements ContainerRequestFilter {
    
        @Override
        public ContainerRequest filter(ContainerRequest request) {
            if(request.getQueryParameters().containsKey("schema")) {
                Schema.name.set(request.getQueryParameters().get("schema").get(0));
            }
            return request;
        }
    }
    

    これにより、すべてのリクエストでスキーマ名が取得されます。このファイラーをアプリケーションのブートストラップに登録します。

    environment.jersey().property(ResourceConfig.PROPERTY_CONTAINER_REQUEST_FILTERS, asList(new SchemaNameFilter()));
    

    次に、このスキーマ情報を使用する2番目の部分を作成する必要があります。このSchemaRewriterを含めます

    public class SchemaReWriter implements StatementLocator {
        @Override
        public String locate(String sql, StatementContext ctx) throws Exception {
            if (nonNull(Schema.name.get())) {
                sql = sql.replaceAll(":schema", Schema.name.get());
            }
            return sql;
        }
    }
    

    すべてのスキーマにあるテーブル「users」にアクセスしたいとします。次のようにクエリを記述します。

    @OverrideStatementLocatorWith(SchemaReWriter.class)
    public interface UserDao {
    
      @SqlQuery("select * from :schema.users")
      public List<User> getAllUsers();
    
    }
    

    ステートメントリライターでDaoに注釈を付けることを忘れないでください。それで全部です。複数のスキーマについて心配する必要はありません。



    1. Golangを使用してMySQLテーブルをJSONにダンプする

    2. カラム側の暗黙的な変換はどれくらいの費用がかかりますか?

    3. PDOとMySQLでクエリを更新する

    4. データベースのセキュリティ-転送中および保存中のバックアップ暗号化