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

Bruger du Dropwizard og JDBI til at forespørge databaser med flere skemaer?

Ideel måde at gøre dette på er at fange skemarelaterede oplysninger fra anmodningen og gemme dem i ThreadLocal og indstille skemaet, når forbindelsen er anmodet. Desværre, da jeg prøvede denne tilgang, fandt jeg, at setSchema-metoden endnu ikke er implementeret i drivere. Men jeg fandt en anden måde (hack) at løse dette på. JDBI leverer sætningslocator, som vi kan bruge her til at løse dette problem.

Lad os sige, at vi sender skemanavn i forespørgselsparameter, vi kan bruge jersey-anmodningsfilter til at få skemanavn.

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

Dette vil få skemanavnet på hver anmodning. Registrer denne filer på din applikations bootstrap.

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

Nu skal vi skrive den anden del, hvor vi skal bruge denne skemainformation. Inkluder denne 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;
    }
}

Lad os sige, at vi vil have adgang til tabellen "brugere", som er i alle skemaerne, skriv en forespørgsel som denne.

@OverrideStatementLocatorWith(SchemaReWriter.class)
public interface UserDao {

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

}

Glem ikke at annotere Dao med StatementRewriter. Det er alt. Du behøver ikke bekymre dig om flere skemaer.



  1. Sortering efter rækkefølgen af ​​værdier i en SQL IN()-sætning

  2. Halloween-problemet – del 2

  3. Macports mysql5 opsætning under Snow Leopard

  4. Forberedt flere Indsæt mysqli