sql >> Databáze >  >> RDS >> Mysql

Používáte Dropwizard &JDBI k dotazování databáze s více schématy?

Ideální způsob, jak to udělat, je zachytit informace související se schématem z požadavku a uložit je do ThreadLocal a nastavit schéma vždy, když je požadováno připojení. Bohužel, když jsem zkusil tento přístup, zjistil jsem, že metoda setSchema ještě není implementována v ovladačích. Ale našel jsem jiný způsob (hack), jak to vyřešit. JDBI poskytuje výpis Locator, který zde můžeme použít k vyřešení tohoto problému.

Řekněme, že v dotazu Parametr posíláme název schématu, k získání názvu schématu můžeme použít filtr požadavku na dres.

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

Tím získáte název schématu pro každý požadavek. Zaregistrujte tento soubor na bootstrapu vaší aplikace.

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

Nyní musíme napsat druhou část, kde bychom měli použít tyto informace o schématu. Zahrnout tento 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;
    }
}

Řekněme, že chceme přistupovat k tabulce "users", která je ve všech schématech, napište dotaz takto.

@OverrideStatementLocatorWith(SchemaReWriter.class)
public interface UserDao {

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

}

Nezapomeňte Dao anotovat pomocí StatementRewriter. To je vše. Nemusíte si dělat starosti s více schématy.



  1. Mysql vybrat záznamy s offsetem

  2. Proč je SQLAlchemy count() mnohem pomalejší než nezpracovaný dotaz?

  3. Dotaz MySQL trvá déle než 6 sekund

  4. Nemohu získat tento spojovací dotaz mysql, aby přinesl požadovaný výsledek