La forma ideal de hacer esto es capturar la información relacionada con el esquema de la solicitud y guardarla en ThreadLocal y configurar el esquema cada vez que se solicite la conexión. Desafortunadamente, cuando probé este enfoque, encontré que el método setSchema aún no está implementado en los controladores. Pero encontré otra forma (truco) de resolver esto. JDBI proporciona un localizador de declaraciones que podemos usar aquí para resolver este problema.
Digamos que estamos enviando el nombre del esquema en el parámetro de consulta, podemos usar el filtro de solicitud de jersey para obtener el nombre del 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;
}
}
Esto obtendrá el nombre del esquema en cada solicitud. Registre este archivador en el arranque de su aplicación.
environment.jersey().property(ResourceConfig.PROPERTY_CONTAINER_REQUEST_FILTERS, asList(new SchemaNameFilter()));
Ahora necesitamos escribir la segunda parte, donde debemos usar esta información del 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 acceder a la tabla "usuarios" que se encuentra en todos los esquemas, escriba una consulta como esta.
@OverrideStatementLocatorWith(SchemaReWriter.class)
public interface UserDao {
@SqlQuery("select * from :schema.users")
public List<User> getAllUsers();
}
No olvide anotar Dao con StatementRewriter. Eso es todo. No necesita preocuparse por múltiples esquemas.