Quali sono le migliori pratiche o falle di cui dobbiamo essere a conoscenza quando si utilizza il provider Microsoft Oracle in un'applicazione .NET incentrata sui servizi Web?Best practice quando si utilizza Oracle DB e .NET
risposta
Alcune pratiche ci avvaliamo base alla nostra esperienza di produzione:
- connessioni Convalida durante il loro recupero dal pool di connessioni.
- scrivere il codice di servizio di non supporre che i collegamenti siano validi - in caso contrario si può causare un po 'di dolore soprattutto in ambienti di produzione
- Ove possibile, in modo esplicito vicino e smaltire i collegamenti dopo il loro utilizzo (
using(conn){}
blocchi funzionano bene) - In un servizio, è necessario utilizzare le connessioni per il minor tempo possibile, in particolare se si desidera creare una soluzione scalabile.
- Prendere in considerazione l'utilizzo di timouts espliciti su richieste appropriate alla durata tipica di una richiesta. L'ultima cosa che vuoi è avere un tipo di richiesta che blocchi per bloccare potenzialmente l'intero sistema.
- Ove possibile, utilizzare le variabili di associazione per evitare errori di analisi nel database (può essere un incubo di prestazioni se non si avvia questa pratica). L'uso delle variabili di bind inoltre ti protegge dagli attacchi di base di SQL injection.
- Assicurati di avere un supporto diagnostico adeguato integrato nel tuo sistema - considera la possibilità di creare un wrapper attorno alle chiamate ADO Oracle in modo da poterlo strumentare, registrare e localizzare tutti.
- Considerare l'utilizzo di stored procedure o viste quando possibile per spingere la semantica delle query e la conoscenza del modello di dati nel database. Ciò consente una più semplice profilazione e ottimizzazione delle query.
- In alternativa, utilizzare una buona libreria ORM (EF, Hibernate, ecc.) Per incapsulare l'accesso ai dati, in particolare se si eseguono operazioni di lettura e scrittura.
- Estendere quanto sopra: non aggiungere il codice a dozzine di frammenti SQL scritti individualmente. Questo diventa rapidamente un incubo di manutenibilità.
- Se si è impegnati in Oracle come database, non aver paura di utilizzare funzionalità specifiche di Oracle. La libreria ODP fornisce l'accesso alla maggior parte delle funzionalità, come la restituzione di cursori di tabella, operazioni batch, ecc.
- Oracle considera stringhe vuote ("") e NULL equivalenti - .NET no. Normalizza il tuo trattamento delle corde come appropriato per Oracle.
- Considerare l'utilizzo di NVARCHAR2 anziché VARCHAR2 se si memorizzerà la stringa Unicode .NET direttamente nel database. Altrimenti, converti tutte le stringhe unicode per conformarsi al sottoinsieme ASCII principale. In caso contrario, si potrebbero causare tutti i tipi di problemi di corruzione dei dati confusi e maligni.
I Fornitori Oracle funzionano bene in un'applicazione ASP.NET, ma essere consapevoli di:
- corrispondenza la giusta versione del client Oracle a 32 bit o 64-bit con il pool di applicazioni
- Client a 32 bit per un pool di applicazioni a 32 bit, client a 64 bit per un pool di applicazioni a 64 bit.
- Permessi - accogliere le app pool diritti utente alla directory client Oracle (c: \ oracle \ product \ 10.2.0 \ Client_1)
Questo non ha nulla a che fare con ASP.NET, ma è importante notare che Oracle memorizza stringa vuota e null sia come null, quindi se è necessario sapere che qualcosa era vuoto e non null, è necessario aggiungere una colonna aggiuntiva per tracciare ...
alcuni ulteriori suggerimenti:
- Evitare di utilizzare provider Microsoft Oracle perché va di supporto (http://blogs.msdn.com/adonet/archive/2009/06/15/system-data-oracleclient-update.aspx)
- Se siete impegnati a caratteristiche specifiche di Oracle utilizzare Oracle e collega Oracle.DataAccess assemblaggio al codice
- Se non si è sicuri e si desidera essere flessibili, utilizzare le classi System.Data.Common e caricare orac le provider tramite
Anche il provider Microsoft Oracle (fornito insieme al framework .NET) ha problemi nell'analisi di valori elevati in StoredProcedures. Gli articoli di grandi dimensioni (più grandi di 32000 byte credo) causano errori sui tipi di mancata corrispondenza. Questo può causare grossi problemi quando si lavora con BLOB e lungo (che sta memorizzando testi lunghi). Le query con parametri sono tuttavia in grado di ricevere articoli di grandi dimensioni (attualmente uno dei miei progetti utilizza un trucco per aggirare questo problema). – Gertjan
La lunghezza massima di una stringa in una stored procedure è di 32 caratteri (o byte). Tutto più grande dovrebbe essere di tipo LOB (BLOB, CLOB o NCLOB). Un LOB può essere> 2 GB di dimensione. – Christian13467
- 1. Best practice per SQLite DB e ContentProvider
- 2. Sviluppo Web. Best practice .NET
- 3. Best practice: quando devo utilizzare un delegato in .NET?
- 4. best practice per evitare il timeout della connessione quando si utilizza LINQ to SQL
- 5. Usi comuni e best practice per domini applicativi in .NET?
- 6. Ricordami Cookie best practice?
- 7. Direttive AngularJS - best practice quando si utilizza ngModel con widget jQuery
- 8. Best practice NGen e Gacutil
- 9. Hibernate/JPA DB Best practice per lo schema di generazione
- 10. jQuery Standard e Best Practice
- 11. php e mysql, best practice
- 12. Best practice con jQuery e chiamate AJAX
- 13. node.js + best practice boilerplate
- 14. Hibernate Performance Best Practice?
- 15. architettura phonegap best practice
- 16. Best practice di RestAngular
- 17. DTO: best practice
- 18. Laravel Cache :: Best practice
- 19. best practice quando l'ordine delle chiamate in classe è importante?
- 20. C# sottoclasse Best Practice
- 21. Django visualizza sicurezza e best practice
- 22. Best practice Maven
- 23. Best practice di confronto
- 24. Best practice Sitecore
- 25. Best practice sul frammento
- 26. ActionListener best practice
- 27. Class best practice
- 28. Selenio, best practice Nunit?
- 29. Best practice per una libreria .NET multi-target
- 30. Azure ACS - Implementazione best practice
+1 abbastanza utile. Lascerò aperta la domanda in modo che anche altri possano contribuire a questo. – Vivek
@LBushkin - La chiusura di una connessione non è sufficiente? Perché dovrei smaltire? –
In generale, se un tipo implementa IDisposable, è una buona idea chiamare Dispose() su di esso quando hai finito - è la cosa più amichevole da fare, in modo che se il codice sottostante esegue qualsiasi ottimizzazione (ad es. Rilascio anticipato di risorse) ha l'opportunità di farlo. Nel caso specifico delle connessioni al database, alcune librerie si ottimizzano internamente in risposta allo smaltimento delle connessioni, il che è una buona cosa sia per l'app che per il database, poiché nella maggior parte dei casi le connessioni sono effettivamente raggruppate. Basta chiudere la connessione non sempre è sufficiente per suggerire al fornitore sottostante che hai finito. – LBushkin