2009-08-05 12 views

risposta

17

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.
+0

+1 abbastanza utile. Lascerò aperta la domanda in modo che anche altri possano contribuire a questo. – Vivek

+0

@LBushkin - La chiusura di una connessione non è sufficiente? Perché dovrei smaltire? –

+0

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

3

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 ...

4

alcuni ulteriori suggerimenti:

+0

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

+0

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