Pregunta

Por lo general, cuando se define un DAO, que tendría un regulador de la fuente de datos en el objeto DAO. Mi problema es que nuestra fuente de datos varía dinámicamente basándose en la petición al servidor. es decir, cada petición puede tener acceso diferente instancia de base.

La solicitud tiene propiedades lógicas, que luego puede usarse para recuperar la conexión con el DB de la solicitud.

Así que cuando la dependencia de la inyección de la DAO al objeto de lógica de negocio, necesito una manera de establecer las propiedades en la DAO en tiempo de ejecución (no de configuración de tiempo).

Una solución es almacenar la fuente de datos en la secuencia de procesamiento local, pero no me gusta mucho jugar con las variables locales de rosca.

Otra opción es tener un método initialize en el objeto de la lógica de negocio que requiere inicializar en el DAO con las propiedades de la solicitud.

Creo que es un problema común, se puede sugerir una solución común?

¿Fue útil?

Solución

Parece que su problema es que se está creando una instancia única de DAO para su aplicación. O se necesita para crear una instancia independiente para cada fuente de datos (tal vez hacer algún tipo de controlador de DAO para manejar todo para usted) o posiblemente permitir que sus métodos en su dao a ser estática y pasar toda la información acerca de cómo conectarse a la fuente de datos, junto con los datos que siguen existiendo en cada método.

Otros consejos

Su problema es un poco confuso. Tener un acceso DAO múltiples fuentes de datos diferentes parecería ser una pesadilla de mantenimiento. Como resultado de ello, debe definir una interfaz DAO contiene todos los métodos que se quieren llamar. Para cada base de datos que se está conectando me construiría una nueva clase que implementa la interfaz DAO. Esto le permite tener múltiples implementaciones. Entonces yo almacenar estas implementaciones (cada uno que tiene su propia fuente de datos) en un mapa (java.util.Map), utilizando sus "propiedades lógicas" como la clave para el mapa. Puesto que todas sus implementaciones DAO implementan la interfaz de usted será capaz de echarlos a la interfaz y utilizarlos indistintamente. En su objeto de negocio, que le inyectará el Mapa de implementaciones DAO. Espero que esto ayuda a su diseño.

Es posible que desee ver en esta clase:

http: //static.springframework.org/spring/docs/2.5.x/api/org/springframework/jdbc/datasource/lookup/AbstractRoutingDataSource.html

Esto hará que sea más fácil para sus objetos de servicio y objetos de acceso a datos a ser ignorante de que exista ningún noción de fuentes de datos dinámicos.

Por lo general lo que se necesita para implementar un filtro de servlet y utilizar un ThreadLocal por lo que la aplicación DataSourceLookup utilizado por AbstractRoutingDataSource puede acceder fácilmente a los parámetros de la petición que dictan qué fuente de datos se devuelve. Si realmente quiere evitar eso, se podría aplicar un filtro de servlet, que establece las propiedades de un grano de petición con ámbito e inyectar que el frijol en la implementación DataSourceLookup que has escrito. habas petición con ámbito todavía utilizan un ThreadLocal en su aplicación pero al menos esta manera es impl de primavera, no el suyo, y que no tienen que preocuparse por ello. :)

enfoque similar se detalla en esta entrada del blog del equipo de Primavera:

http://blog.springsource.com/2007/01 / 23 / dinámico-fuente de datos de ruta /

He tenido un problema como en un proyecto de cliente / servidor. proyectos de cliente y servidor se comparten interfaces de DAO. Y cuando yo solía hacer la operación de base de datos tuviera que seleccionar la aplicación adecuada Dao. Mi solución fue la siguiente:

IVehicleDao vehicleDao =daoFactory.Get<IVehicleDao>(parameters);
vehicleDao.doSomething();

Obtener DAO de la fábrica mediante el paso de la fábrica parameters.Inside Dao Dao decidir qué aplicación para regresar ..

ya lo hacía antes. Es necesario crear un DAO cada clase, y en el alcance de su DAO que necesita para aprobar el origen de datos y, finalmente, un controlador de clase en el que hacer la llamada dinámica a DAO.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top