Mysql
 sql >> Database >  >> RDS >> Mysql

Utilizzi Dropwizard e JDBI per interrogare il database con più schemi?

Il modo ideale per farlo è acquisire le informazioni relative allo schema dalla richiesta e salvarle in ThreadLocal e impostare lo schema ogni volta che viene richiesta la connessione. Sfortunatamente, quando ho provato questo approccio, ho scoperto che il metodo setSchema non è ancora implementato nei driver. Ma ho trovato un altro modo per risolvere questo problema. JDBI fornisce un localizzatore di istruzioni che possiamo usare qui per risolvere questo problema.

Diciamo che stiamo inviando il nome dello schema nel parametro di query, possiamo utilizzare il filtro di richiesta jersey per ottenere il nome dello schema.

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

Questo otterrà il nome dello schema su ogni richiesta. Registra questo filer sul bootstrap dell'applicazione.

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

Ora dobbiamo scrivere la seconda parte, dove dovremmo usare queste informazioni sullo schema. Includi questo 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;
    }
}

Diciamo che vogliamo accedere alla tabella "users" che è in tutti gli schemi, scrivi query in questo modo.

@OverrideStatementLocatorWith(SchemaReWriter.class)
public interface UserDao {

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

}

Non dimenticare di annotare Dao con StatementRewriter. È tutto. Non devi preoccuparti di più schemi.