Comparação de estratégias no pattern DataMapper

Ola pessoALL,
Gostaria de saber a opinião de vocês quanto à estratégia de DataMapper
utilizada no livro “Patterns Of Enterprise Application Architecture” do Martin
Fowler.

Ele diz que antes de uma determinada consulta ser feita(por exemplo,
busca por primary key), primeiro deve ser verificado se o objeto
correspondente ao id esta em cache, retornando o cache caso esteje ou
executando a busca caso não esteje. Nesse caso tudo beleza.

Mas e no caso de uma busca tipo buscar todos os usuários de uma
cidade…
para eu verificar se um usuário está em cache, eu tenho que ter o id do
usuário, e para ter o id do usuário, eu tenho que executar a busca por
cidade. Executando a busca, pego o resultSet e obtenho o id do usuário.
Se o usuário correspondente àquele id estiver em cache pego este do
cache, caso contrário, termino de processar o resultSet construindo um
objeto e coloco ele em cache.

[color=“red”]A pergunta é…se eu ja fui ao banco obter os usuários de uma cidade é
melhor eu atualizar o cache, mesmo o objeto já estando nele, ou
simplesmente verifico pelo id, e caso encontre no cache, retorne o do
cache e ignora o processamento do restante do resultSet?
[/color]

Agradeceria MUITO se alguém debatesse esse assunto comigo, pois estou
realmente precisando encontrar a melhor solução…

Valew…

O que os mecanismos de persistencia costumam fazer é consultar o banco duas vezes, a primeira SELECT seleciona somente os campos da PK, dai vc faz uma lista com os objetos que existem na cache e outra com os objetos que não existem. Na segunda SELECT vc busca todos os campos com as chaves de todas os objetos que não estavam na cache na WHERE de sua SELECT.
Esta é uma abordagem interessante, pois conforme a politica de cache em uso a possibilidade dos objetos existirem lá é grande, além do fato de vc buscar no banco somente as informações que vc realmente precisa.
Se vc está usando entity beans BMP quando o commit-type é A,B ou D (JBoss) a chance do bean existir em cache é muito grande, pois eles não são passivados ao término da transação.