Patrón de diseño que define la acción y el objetivo.

Tengo un GenericDAO que delega sus operaciones a una clase DataSource

public class BaseDAOImpl<T> implements BaseDAO<T> {     
    DataSource ds;      

    public T update(T entity) {
    ds.update(entity);
    }

El problema que tengo ahora es que queremos que funcione con múltiples DataSources. Esto me deja con 2 alternativas.

1) crea un setter en DAO para el origen de datos y úsalo antes de cada operación

2) cree cada hijo de BaseDAO n veces por número de fuentes de datos

Me gustaría que DataSource salga de DAO, pero ¿cómo se le pueden delegar las acciones?

Respuesta 1

Supongo que desea implementar algo como multitenencia: cuando la solicitud proviene del usuario A, todos los DAO involucrados en el procesamiento de esa solicitud deben comunicarse con el usuario A DataSource, y así sucesivamente.

Si es así, DataSourcees parte del contexto de su solicitud, y una posible opción para almacenar este tipo de datos contextuales es usar ThreadLocal:

  • Cuando llega la solicitud, pones lo apropiado DataSourceenThreadLocal
  • Todos los DAO obtienen el DataSourcede eso ThreadLocal.
    Obviamente, por el Principio de Responsabilidad Única, sería mejor ocultar esta lógica detrás de una fábrica e inyectar esa fábrica en sus DAO, para que los DAO soliciten factory.getCurrentDataSource()cada operación.
  • Borrar ThreadLocalcuando termine de procesar la solicitud.

Tenga en cuenta que solo funciona si cada solicitud es procesada por un solo hilo.

Respuesta: 2

Puede usar una fábrica para crear su fuente de datos, por lo que, según sus necesidades, cree su fuente de datos y luego, si puede usar la inyección de dependencia para inyectar su fuente de datos en su DAO.

Para deshacerse de la fuente de datos en DAO, puede usar el Patrón de delegado, inyectar delegador en su DAO, su delegado tendrá referencia de DataSource.

También para tener en cuenta que si persiste con solo un DAO genérico, su DAO puede ser borrado con métodos que no son genéricos pero más específicos para una determinada funcionalidad de su aplicación, en mi humilde opinión, también debería considerar romper su DAO a un nivel más específico dejando el genérico DAO realmente hace el trabajo genérico.

Respuesta: 3

No usaría un setter para la fuente de datos, lo pasaría en el constructor para el DAO. No parece correcto poder cambiar la fuente de datos durante la vida del objeto DAO.

Respuesta: 4

quería practicar el desarrollo de programas de bases de datos en java, así que configuré el classpath en E: \ software \ instalado \ java \ jre \ lib declarando un nuevo classpath de variable ambiental y le di el valor como E: \ software \ ...

Tengo una matriz 2d dbl llena de datos, a la que puedo llamar en cualquier lugar dentro del código: System.out.println (twodarray [0] [0]); Y funciona bien. Cuando lo llamo como parte de Actionlistener no funcionará, ...

Quiero crear una expresión regex que genere una coincidencia y elimine los $ y los dos últimos caracteres, si el último carácter termina en una letra mayúscula más un número. Me quitaré los $ y ...

Tengo un proyecto Java Google App Engine que hace referencia a una clase en otro proyecto y, en tiempo de ejecución, obtengo NoClassDefFoundError. Llamaré a mi proyecto de Google App Engine 'Principal' y al proyecto ...