Wow, grande domanda. Non sono sicuro che un semplice mortale possa rispondere. Ma penso che tu sia troppo veloce per respingere "la possibilità di cambiare il tuo database". Esistono molti pacchetti software, sia commerciali che open source, che offrono la possibilità di lavorare con diversi RDBMS come backing store. Gestire l'SQL per la distribuzione su 2+ piattaforme di database può diventare un incubo assoluto, quindi avere qualcosa che costruisca il tuo SQL in modo prevedibile (almeno rispetto a farlo scrivere a mano) è un enorme vantaggio. Proprio come sostenitore del diavolo, per alcune piattaforme di database ho potuto vedere una crescita del throughput delle transazioni rendendo una scelta di database proibitivamente costosa. La maggior parte degli ORM ti aiuterà in questo modo in un modo o nell'altro, anche se l'API di una query avanzata può fare molto quando le esigenze del database sono sufficientemente complesse.
La risposta breve è che quando il database ha bisogno di un'applicazione per raggiungere un certo livello di complessità, il costo per soddisfare i requisiti non è inferiore al costo della curva di apprendimento di nhibernate. Non posso offrire risposte complete, ma cercherò di esprimere le mie opinioni sugli articoli della lista.
- Quando si sta facendo più di un semplice CRUD. L'esigenza di query complesse su più piattaforme di database è probabilmente un buon esempio. Su questo tipo di app si può quasi finire per mantenere due codebase separati (beh, diventano davvero distaccati se si va sul percorso proc memorizzato) e ci può essere un valore nel mantenere tutto il codice in .net (è bello essere in grado di unità prova queste domande con il resto del tuo codice, per esempio).
- A parte i problemi riscontrati negli ambienti di media affidabilità, non sono sicuro di cosa sia il caricamento lento che "non funziona" ora. L'unico problema con il caricamento lento nei miei occhi è che devi essere consapevole di ciò per evitare alcuni dei problemi che possono verificarsi quando si prelevano grandi quantità di dati, principalmente il problema di selezione N + 1.
- Non è necessario calcolare le istruzioni batch: è sufficiente impostare un valore di configurazione e non pensarci più.Questa è un'enorme ottimizzazione che NHibernate fa per te con il minimo sforzo: il tuo codice può essere molto più pulito quando è direttamente interessato alle operazioni e al controllo delle transazioni.
- La memorizzazione nella cache dei dati restituiti può essere utile quando si esegue il rendering delle pagine in modo diverso per utenti diversi o si esegue qualsiasi tipo di elaborazione non banale nel livello del dominio. Anche negli scenari di base, con la cache di output delle pagine potresti finire con la pagina di modifica, la pagina dei dettagli, ecc ... nella cache, mentre nella cache i tuoi dati più vicini all'origine hai solo bisogno di mettere in cache l'entità una volta. La memorizzazione nella cache più vicina alla fonte offre inoltre una maggiore protezione dal servire dati obsoleti. Una cache orientata ai dati può anche essere condivisa su più applicazioni, tramite servizi o puntando nHibernate a un archivio out-of-process come memcached o redis. Questo può essere estremamente prezioso in alcuni ambienti.
- Non sono sicuro che tu abbia bisogno di capire come funziona (molte volte uso librerie open-source per proteggermi dal dover capire i dettagli di implementazione di questo genere di cose). Ma la risposta breve è che nessuno di questi si comporta in modo diverso in uno scenario distribuito, ad eccezione del caching (e solo del 2 ° livello di memorizzazione nella cache). Finché utilizzi un provider di cache distribuita (o indirizza tutti i tuoi server allo stesso provider di cache out-of-process), dovresti essere bravo anche su questo fronte.
Sto solo parlando di Ibernare, ma immagino che per Hibernate la storia sia la stessa. Per applicazioni su scala più grande, le applicazioni più complesse possono essere molto vantaggiose, ma c'è un sacco di complessità aggiuntiva che è necessario assumere per trarre questo vantaggio - è ancora probabilmente meno complesso di una soluzione personalizzata per tutti i problemi * Hibernate risolve per te.
Hai anche avuto un sacco di domande sulla memorizzazione nella cache sembra. Suggerisco di leggere oltre this link per avere un'idea di come funzionano le cache di primo e secondo livello. Non cercherò di spiegare qui, perché suona come si sta dopo una comprensione più profonda di quanto io possa inserirsi in questa già lunga risposta :)