Mysql
 sql >> Base de données >  >> RDS >> Mysql

Utiliser Dropwizard &JDBI pour interroger la base de données avec plusieurs schémas ?

Le moyen idéal pour ce faire est de capturer les informations relatives au schéma à partir de la demande et de les enregistrer dans ThreadLocal et de définir le schéma chaque fois que la connexion est demandée. Malheureusement, lorsque j'ai essayé cette approche, j'ai trouvé que la méthode setSchema n'était pas encore implémentée dans les pilotes. Mais j'ai trouvé un autre moyen (hack) de résoudre ce problème. JDBI fournit un localisateur d'instructions que nous pouvons utiliser ici pour résoudre ce problème.

Disons que nous envoyons le nom du schéma dans le paramètre de requête, nous pouvons utiliser le filtre de demande de maillot pour obtenir le nom du schéma.

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

Cela obtiendra le nom du schéma sur chaque demande. Enregistrez ce filer sur le bootstrap de votre application.

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

Nous devons maintenant écrire la deuxième partie, où nous devons utiliser ces informations de schéma. Inclure ce 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;
    }
}

Disons que nous voulons accéder à la table "users" qui se trouve dans tous les schémas, écrivez une requête comme celle-ci.

@OverrideStatementLocatorWith(SchemaReWriter.class)
public interface UserDao {

  @SqlQuery("select * from :schema.users")
  public List<User> getAllUsers();

}

N'oubliez pas d'annoter Dao avec StatementRewriter. C'est tout. Vous n'avez pas à vous soucier de plusieurs schémas.