es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cambiar Schema basado en llamada desde controlador REST.

Tenemos dos productos: Producto A y Producto B, y ambos tienen controladores REST diferentes. Ambos de estos controladores están llamando al mismo servicio común y el servicio común está llamando a los métodos DAO comunes. Quiero seleccionar el esquema en los métodos DAO comunes en función de qué productos se haya realizado la llamada. Entonces, por ejemplo, si la llamada proviene del controlador del Producto A, seleccionar el esquema como A o de lo contrario B.

Quiero usar la misma conexión de base de datos y cambiar el esquema en función de qué controlador se realiza la llamada. Una posible solución sería pasar el nombre del esquema desde la capa del controlador a la capa del servicio, que a su vez lo pasa a la capa del DAO. Quiero evitar tener dos fuentes de datos diferentes y luego cambiar entre ellas dinámicamente.

Entonces, ¿hay alguna otra forma mejor de hacer esto?

Nota: Estamos usando Mybatis como nuestra capa de persistencia.

Por favor, encuentra el código de muestra:

Controlador para Producto A

@Component
public class ProductoA {

private final CommonService commonService;

public ProductoA(CommonService commonService){
    this.commonService = commonService;
}

@GET
@Path("/test/dbSchema")
@Produces(MediaType.APPLICATION_JSON)
public Response getTotalProducts(){
    // Llamando al método del servicio común aquí para obtener el total de productos

}

}

Controlador para Producto B

@Component
public class ProductoB {
private final CommonService commonService;

public ProductoB(CommonService commonService){
    this.commonService = commonService;
}

@GET
@Path("/test/dbSchema")
@Produces(MediaType.APPLICATION_JSON)
public Response getTotalProducts(){
    // Llamando al método del servicio común aquí para obtener el total de productos

}

}

FYI: Estamos usando Jersey.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una posible solución para cambiar dinámicamente el esquema en la capa Mybatis DAO según el controlador que llame al servicio común sería utilizar una variable ThreadLocal para almacenar el nombre del esquema en la capa de servicio.

    Aquí te mostramos cómo se puede lograr:

    1. Crea una variable ThreadLocal para almacenar el nombre del esquema en la capa de servicio.
      private static ThreadLocal<string> nombreEsquema = new ThreadLocal<>();
      
    2. Crea un método en la capa de servicio para establecer el nombre del esquema en la variable ThreadLocal.
      public static void setNombreEsquema(String nombreEsquema) {
          MyService.nombreEsquema.set(nombreEsquema);
      }
      
    3. Crea un método en la capa de servicio para obtener el nombre del esquema desde la variable ThreadLocal.
      public static String getNombreEsquema() {
          return MyService.nombreEsquema.get();
      }
      
    4. En la capa de controlador, llama al método setNombreEsquema() de la capa de servicio con el nombre del esquema basado en el controlador de producto.
      MyService.setNombreEsquema("A");
      
    5. En la capa MyBatis DAO, obtén el nombre del esquema desde la variable ThreadLocal utilizando el método getNombreEsquema() de la capa de servicio.
      <select id="getTotalProducts" resulttype="int">
          select count(*) from ${nombreEsquema}.PRODUCTOS;
      </select>
      
    6. Asegúrate de limpiar la variable ThreadLocal en la capa de servicio después de procesar la solicitud utilizando un ServletFilter para evitar posibles fugas de memoria.

    Nota: Esta solución asume que los nombres de esquema para el Producto A y el Producto B son conocidos y fijos. Si los nombres de esquema necesitan generarse dinámicamente o recuperarse de una base de datos, se requerirá una solución alternativa.

Comments are closed.