Ho trovato che ci sono pochissime informazioni su questo argomento, speravo che qualcuno potesse indirizzarmi a qualche informazione e possibile codice di esempio.Condivisione di una connessione db tra thread in un'applicazione C#?
risposta
Direi che non condividere l'oggetto di connessione stesso, basta creare una nuova connessione e lasciare ADO.net gestire il pool di connessioni.
Tendo ad essere d'accordo, il server di database è progettato per gestire il pool di connessioni, è meglio lasciare al server DB quello che era progettato per fare. –
In genere le connessioni non sono thread-safe (SqlConnection, MySqlConnection e OracleConnection indicano in modo specifico che non sono thread-safe).
Non condividere una connessione tra thread.
Non c'è alcun codice di esempio in circolazione perché (quasi) nessuno lo fa perché è un'idea molto, molto, pessima.
per rispondere ai parametri attuali della questione, piuttosto che licenziare, vorrei avvolgere il DbCommand
per aiutare sincronizzare l'accesso alla connessione (se e solo se è assolutamente necessario).
public class SyncedDbCommand : DbCommand
{
private DbCommand _cmd;
private object _sync;
public SyncedDbCommand(DbCommand cmd, object sync)
{
_cmd = cmd;
_sync = sync;
}
// omitted basic proxy method overrides
protected override DbDataReader ExecuteDbDataReader(CommandBehavior behavior)
{
Monitor.Enter(_sync);
return _cmd.ExecuteReader();
}
public override int ExecuteNonQuery()
{
Monitor.Enter(_sync);
return _cmd.ExecuteNonQuery();
}
public override object ExecuteScalar()
{
Monitor.Enter(_sync);
return _cmd.ExecuteScalar();
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
Monitor.Exit(_sync);
}
base.Dispose(disposing);
}
}
Per utilizzare l'esempio, bisogna istanziare con un vero e proprio DbCommand
così come qualche caso oggetto che viene condiviso tra tutti gli usi di una connessione. Nell'uso più semplice, si potrebbe persino passare l'oggetto di connessione stesso come oggetto di blocco. L'istanziazione dovrebbe verificarsi in un'istruzione using
. Questo non ti assolve dal sapere esattamente quali sono i tuoi requisiti di utilizzo e come funzionano la classe Monitor
e il blocco.
In un modo o nell'altro, si desidera sincronizzare l'utilizzo della connessione tra thread e quanto sopra è un approccio per farlo.
Assolutamente NON farlo, non ci sono buoni motivi per farlo e influirà sulle prestazioni della tua applicazione. Utilizzare il pool di connessioni come gli stati di risposta sopra. –
"Nessun buon motivo"? Senza conoscere l'architettura del suo codice come puoi affermarlo? Per quanto riguarda la condivisione di una connessione, è un metodo ben noto per abilitare le transazioni senza promuovere a MSDTC. Questo è un enorme vantaggio in termini di prestazioni. Tuttavia, partendo da zero, ovviamente non consiglierei l'approccio descritto nella mia risposta. Ma nel * rispettare il richiedente e rispondere ai particolari della sua domanda *, questa è la mia raccomandazione. –
Ancora in attesa di essere illuminato ... –
- 1. pgAdmin - Condivisione definizioni di connessione DB
- 2. SQLite: condivisione di connessioni tra thread per leggere e scrivere
- 3. Condivisione di variabili tra C# e C++
- 4. Condivisione di una connessione WebSocket tra Socket.IO e WS
- 5. Condivisione di una connessione db globalmente definita con più pacchetti in Golang
- 6. C# Comunicazione tra thread
- 7. Condivisione di variabili mutabili tra i thread in Rust
- 8. Dati principali - condivisione di NSManagedObjects tra più thread
- 9. Differenza tra le modalità di condivisione "Tutti i thread" e "Gruppo thread attuale" in Jmeter
- 10. Connessione dbx separata a una thread
- 11. connessione DB condivisa vs connessioni DB private
- 12. Condivisione di una variabile tra processi
- 13. Thread in C# - Inserimento di messaggi tra thread
- 14. Condivisione di metodi tra più controller C# MVC4
- 15. Quando DataContext aprirà una connessione al DB?
- 16. Condivisione di classi tra progetti in xcode/objective-c
- 17. C++ condivisione di oggetti di classe singola tra più processi
- 18. Creazione di una libreria C thread-thread
- 19. Condivisione di una variabile tra i controller in angular.js
- 20. Condivisione sessione tra due domini
- 21. condivisione di valori dei cookie tra i gruppi di thread in JMeter
- 22. Condivisione della memoria tra due processi (C, Windows)
- 23. C++ - Passaggio di dati tra thread
- 24. Condivisione di dati tra AppDomains
- 25. costanti di condivisione tra le varie lingue
- 26. Due progetti .NET, una stringa di connessione DB?
- 27. C'è un modo in PHP per utilizzare i dati persistenti come in Java EE? (condivisione di oggetti tra thread PHP) senza sessione né cache/DB
- 28. node.js - condivisione di socket tra processi
- 29. connessione multipla DB nel rotaie
- 30. Blocco forzato di una connessione oracle in C#
Immagino che questo differisca anche dal database al fornitore del database ... mysql, ms sql, sqlite ... – tuinstoel