2012-09-27 8 views
19

Dapper si aspetta implicitamente che una connessione sia aperta quando la utilizza. Perché non lo apre e lo chiude da solo? Non sarebbe semplicemente la gestione delle connessioni?Perché Dapper dot net non apre e chiude la connessione stessa?

Chiedo perché un collega e io sto andando avanti e indietro sulla natura di ciò che accade dietro le quinte con il pool di connessioni, e se c'è qualche vantaggio nel mantenere una connessione aperta tra più comandi, o aprilo e chiudilo per ogni comando.

+2

Questo cambiamento è ora impegnato btw –

+0

Ho visto questa mattina :) Grazie mille. Mi piace come lo gestisci ...se è già aperto, lasciarlo aperto. Se è chiuso, chiudilo quando hai finito. Semplice. – smdrager

+0

@MarcGravell Qual è la sintassi per la gestione delle connessioni ora? –

risposta

28

Dapper ora (e per un po 'di tempo) si occupa di questo internamente. Esso funziona solo ™


originale risposta (obsoleto):

Non sei sbagliato. Il motivo per cui non ho notato questo inconveniente è che per motivi legacy (in particolare: usavamo LINQ-to-SQL esclusivamente) la nostra connessione primaria-like-thing è una DataContext - quindi esporremo i metodi dapper come metodi di estensione su DataContext.

La cosa stupida è: ciò che questi metodi fanno è:

using(db.Connection.EnsureOpen()) { 
    db.Connection.{the dapper method} 
} 

Ecco EnsureOpen è un metodo sfacciato che:

  • se la connessione è aperta, restituisce null
  • in caso contrario, apre la connessione e restituisce un token IDisposable che chiude la connessione quando viene eseguito

Quindi: ci siamo sentiti ovviamente esattamente il tuo dolore, ma abbiamo implementato un livello più in alto.

Si prega di registrarlo come una richiesta di funzionalità. Noi abbiamo tutto il codice (anche se dovrò modificarlo leggermente per adattarlo al "lettore" per i dati non bufferizzati) - non c'è assolutamente alcun motivo per cui dapper non possa assumerne la proprietà.

+0

Fantastico! Grazie. – smdrager

+1

@Marc - In questo momento usiamo l'unità di modello di lavoro per gestire la connessione/TransactionScope. Se dovessimo disporre di IDbConnection nel metodo di estensione Query (eliminando in modo efficace la necessità di gestire lo stato della connessione in UnitOfWork), non influirebbe negativamente sulle prestazioni per più query successive? –

+1

@Chris la chiave è di farlo funzionare in entrambe le direzioni. Se vuoi avere una connessione che si estende su più operazioni, allora sicuramente: aprila per la tua unità di lavoro (in realtà, spesso un'intera richiesta web è una unità di lavoro). Se vuoi che lo gestisca internamente, allora dovrebbe essere compatibile con. Non smetterà di funzionare per quello che intendi. Sono più che un po 'consapevole delle richieste di ottimizzazione delle prestazioni :) –

0

Credo che Dapper non gestisca le connessioni in quanto è al di fuori delle sue responsabilità come mappatore ORM. Dapper non sa se riutilizzerai la stessa connessione in seguito - è per questo che accetta una connessione come uno dei parametri. Lo stesso vale per le transazioni: è l'applicazione che dovrebbe gestirlo, non il mappatore ORM.

È semplice scrivere i propri metodi di estensione che gestiscono la connessione.

+0

Non penso che sia al di fuori delle sue responsabilità. Sta accedendo al database, perché non può aprire la connessione quando è pronta per eseguire un comando e chiuderla quando ha finito? È forse un extra di 5 righe di codice. – smdrager

+0

@smdrager Probabilmente alcune righe in più rispetto a 5, a causa delle complicazioni di buffered vs non-buffered, ma non posso essere in disaccordo con te sul resto. –

3

Devo aggiungere una risposta contraria qui, o almeno suggerire che Dapper può gestire le connessioni in modo diverso, se non altro in determinate circostanze. Ho appena riflettuto su Dapper.SqlMapper e ci sono dei controlli nel metodo ExecuteCommand (chiamato out by Execute (sulle API pubbliche)) per verificare se una connessione è chiusa e poi la apre, se non lo è.

Mi sono imbattuto in questo come una revisione del codice da parte del mio collega ha sottolineato che non stavo chiamando esplicitamente un connection.open prima di chiamare via dapper al DB. Questo non è stato rilevato perché i miei test di integrazione erano tutti verdi, tutto era hunky-dory in fase di esecuzione. Quindi ci siamo tuffati nel codice di Dapper. Si potrebbe argomentare che è meglio chiamare open per esplicito, ma al contrario qualcuno potrebbe obiettare che meno codice è, meglio è.

+1

Ho appena visto il commento di Marc sopra a proposito del fatto che le connessioni sono gestite automaticamente. Ci scusiamo per aver affermato ciò che è già noto ad alcuni, ma non è stato immediatamente evidente quando ho esaminato le risposte per la prima volta. – brumScouse

Problemi correlati