Pergunta

Normalmente, quando a definição de um DAO, você teria um setter para a fonte de dados sobre o objeto DAO. Meu problema é que a nossa fonte de dados varia dinamicamente de acordo com a solicitação para o servidor. ou seja, cada pedido pode acessar instância de banco de dados diferente.

O pedido detém propriedades lógicas, que mais tarde pode ser usado para recuperar a conexão com o DB do pedido.

Assim, quando a dependência injetar o DAO para o objeto de lógica de negócios, eu preciso de uma maneira de definir as propriedades no DAO em tempo de execução (não o tempo de configuração).

Uma solução é armazenar a fonte de dados no segmento local, mas eu realmente não gosto de mexer com rosca variáveis ??locais.

Outra opção é ter um método de inicialização na lógica objeto de negócios que as chamadas inicializar o DAO com as propriedades de solicitação.

Eu acho que é um problema comum, você pode sugerir uma solução comum?

Foi útil?

Solução

Parece que o problema é que você está criando uma instância DAO único para sua aplicação. Você quer necessidade de criar uma instância separada para cada fonte de dados (talvez fazendo algum tipo de dao controlador para gerenciar tudo isso para você) ou, eventualmente, permitir que seus métodos no seu dao ser estático e passar todas as informações sobre como conectar-se à fonte de dados, juntamente com os dados que você está persistindo em cada método.

Outras dicas

Seu problema é um pouco confuso. Ter acesso um DAO múltiplas fontes de dados diferentes parece ser um pesadelo de manutenção. Como resultado, você deve definir um DAO relação contendo todos os métodos que você gostaria de chamar. Para cada banco de dados que está a ligar eu iria construir uma nova classe que implementa a interface DAO. Isto permite-lhe ter várias implementações. Eu, então, armazenar essas implementações (cada um que tem seu próprio fonte de dados) em um mapa (java.util.Map), usando suas "propriedades lógicas" como a chave para o mapa. Uma vez que todos os seus Implementações DAO implementar sua interface que você será capaz de lançá-los para a interface e usá-los alternadamente. Em seu objeto de negócios, você iria injetar o Mapa de implementações DAO. Espero que isso ajude o seu design.

Você pode querer olhar para esta classe:

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

Isto tornará mais fácil para os seus objetos de serviço e acesso a dados objetos a serem ignorantes que qualquer noção de fontes de dados dinâmicos existe.

Normalmente você precisa para implementar um filtro de servlet e usar um ThreadLocal para que a implementação DataSourceLookup usado por AbstractRoutingDataSource pode facilmente ter acesso aos parâmetros de solicitação que ditam que DataSource é devolvido. Se você realmente quer evitar isso, você pode implementar um filtro de servlet que conjuntos de propriedades em um bean com escopo de solicitação e injetar esse feijão para a implementação DataSourceLookup você escreveu. feijão com escopo de solicitação ainda usar um ThreadLocal na sua implementação, mas pelo menos desta forma, é impl da Primavera, não sua, e você não precisa se preocupar com isso. :)

abordagem semelhante é detalhado neste blog da equipe de Primavera:

http://blog.springsource.com/2007/01 / 23 / dinâmica-fonte de dados de roteamento /

Eu tive esse problema uma em um projeto de cliente / servidor. projetos de cliente e servidor estava compartilhando as interfaces Dao. E quando eu costumava fazer a operação de banco de dados que eu tinha para selecionar implementação Dao adequado. Minha solução foi assim:

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

Get dao da fábrica, passando parameters.Inside Dao fábrica decidir qual implementação Dao para retorno ..

Eu já fiz isso. Você precisa criar um DAO cada classe, e no âmbito do seu DAO que você precisa para passar a fonte de dados e, finalmente, um controlador de classe onde você faz chamada dinâmica para DAO.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top