Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Usando Dropwizard e JDBI para consultar banco de dados com vários esquemas?


A maneira ideal de fazer isso é capturar as informações relacionadas ao esquema da solicitação e salvá-las em ThreadLocal e definir o esquema sempre que a conexão for solicitada. Infelizmente, quando tentei essa abordagem, descobri que o método setSchema ainda não está implementado nos drivers. Mas eu encontrei outra maneira (hack) de resolver isso. O JDBI fornece a instrução Locator que podemos usar aqui para resolver esse problema.

Digamos que estamos enviando o nome do esquema no parâmetro de consulta, podemos usar o filtro de solicitação de jersey para obter o nome do esquema.
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;
    }
}

Isso obterá o nome do esquema em cada solicitação. Registre este arquivador no bootstrap do seu aplicativo.
environment.jersey().property(ResourceConfig.PROPERTY_CONTAINER_REQUEST_FILTERS, asList(new SchemaNameFilter()));

Agora precisamos escrever a segunda parte, onde devemos usar essas informações do esquema. Incluir este 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;
    }
}

Digamos que queremos acessar a tabela "users" que está em todos os esquemas, escreva a consulta assim.
@OverrideStatementLocatorWith(SchemaReWriter.class)
public interface UserDao {

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

}

Não se esqueça de anotar Dao com StatementRewriter. Isso é tudo. Você não precisa se preocupar com vários esquemas.