Sono in esecuzione in eccezioni LazyLoading come la maggior parte delle persone che tentano la comunicazione remota con un ORM. Nella maggior parte dei casi, il passaggio al recupero fugace risolve il problema (caricamento lento/query non atomiche/sicurezza thread/n + 1 problema ...). Ma il recupero impaziente ha anche degli svantaggi se si ha a che fare con un grafo di oggetti veramente grande.Strategie di caricamento Lazy/Eager in casi remoti (JPA)
Il caricamento dell'intero oggetto grafico non è necessario nei casi più comuni. È brutto caricare più dati necessari (o caricarli dal db ed estrarre il sottoinsieme necessario).
Quindi quali sono i modi alternativi per risolvere questo tipo di problemi (in fase di esecuzione)?
ho visto:
- iniettare un accesso dipendenza dati in oggetto di dominio e lasciare l'oggetto a decidere sia per caricare pigri o ansiosi: si sente male! Il livello del dominio dovrebbe essere indipendente da qualsiasi servizio. L'iniezione di dominio è anche un'operazione costosa. Il dominio dovrebbe essere l'accesso ai dati ignorante e dovrebbe essere utilizzato con o senza accesso ai dati.
- Fetch tutto ciò che è pigro tranne casi d'uso che richiedono più dati: sembra migliore per le prestazioni, ma in questo modo impone molti client => server/database roundtrips. L'inizializzazione dei campi pigri può anche soffrire il dolore (provato con JPA). In questo modo non si sente generico ed è soggetto alle stesse restrizioni pigro menzionate sopra.
- Persistenza incapsulare nella classe Lazy: più complessità, nessuna procedura ottimale per l'interoperabilità con ORM. Livello dei servizi di gonfiore (tanto codice "scritto a mano" si sente male).
- Usa proiezioni complete per ogni caso d'uso: finiremo in SQL e perderemo il vantaggio di un ORM.
- Un livello DTO/Virtual Proxy aumenta la complessità e rende il codice più difficile da mantenere (antipatia Wormhole >> Bloat).
Ho pensato molto a un altro modo. Forse la proiezione generica white./black listning è una soluzione.
Idea (lista nera): definire un elenco di nomi classe con i limiti per un'operazione di recupero. Se una proprietà corrisponde ed è pigro, rimuovere il proxy pigro (CGLIB) e compilare il valore con null. Altrimenti, evitare semplicemente di recuperare (e lasciare il valore su null). Quindi possiamo stabilire confini chiari nei nostri DAO.
Esempio: ProductDao.findByName("Soap",Boundaries.BLACKLIST,"Category, Discount")
gli ultimi due parametri possono anche essere associati a un oggetto Contorni.
Idea (lista bianca): come lista nera, ma è necessario dichiarare proprietà con deve essere caricato in una lista bianca.
Cosa ne pensi di una simile soluzione? (Possibili problemi, restrizioni, vantaggi ...) Come dovrei scrivere questo in java? Forse tramite AOP per abbinare i metodi DAO (perché sono in grado di modificare il comportamento del proxy cglib lì)?
Che tipo di architettura hai? Stai usando GWT, per esempio? – Kaitsu
Servizi Web JAX-WS tramite implementazione di riferimento (Metro) –