[ADO.Net - ASP.net] connexion multiple et singleton design pattern
Bonjour,
J'ai développé un site web en ASP.net - C# qui travaille avec une base de données. Le site fonctionne très bien, sauf lorsqu'il ya deux utilisateurs en même temps ... C'est un problème :-) !!
J'ai une classe qui me permet de créer ma connexion à la base:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
|
/// <summary>
/// Classe permettant l'accès à la base de données
/// </summary>
/// <remarks>Cette classe se base dur DBFactory.
/// Par conséquent, la connexion peut s'effectuer sur différents type de base de données.</remarks>
public class DBAccess
{
#region Variables privées
/// <summary>
/// Connexion à la base de données
/// </summary>
private DbConnection dbConnection = null;
/// <summary>
/// Chaine de connexion à la base de données
/// </summary>
private ConnectionStringSettings connectionStringSettings;
/// <summary>
/// Instance de connexion liée à la base de données
/// </summary>
private static DBAccess gtmInstance;
/// <summary>
/// Verrou sur l'instance de connexion
/// </summary>
private static object gtmInstanceLocker = new object();
#endregion
#region Propriétés
/// <summary>
/// Chaine de connexion vers la base de données
/// </summary>
public ConnectionStringSettings ConnectionStringSettings
{
get { return connectionStringSettings; }
set { connectionStringSettings = value; }
}
/// <summary>
/// Propriété permettant de récupérer l'instance de connexion à la base de
/// données
/// <remarks>Utilise le singleton pattern</remarks>
/// </summary>
public static DBAccess Instance
{
get
{
lock (gtmInstanceLocker)
{
if (gtmInstance == null)
gtmInstance = new DBAccess();
return gtmInstance;
}
}
}
#endregion
#region Méthodes publiques
/// <summary>
/// Méthode permettant la récupération de la connexion à la base de données ouverte
/// </summary>
/// <returns>La connexion à la base de données</returns>
public DbConnection getDataBaseConnection()
{
DbProviderFactory factory = null; // -- DataBase provider
try
{
// -- Récupération du type de base de données en fonction
// -- de la chaine de connexion
// ------------------------------------------------------
factory = DbProviderFactories.GetFactory(connectionStringSettings.ProviderName);
// -- Création de la connexion
// ---------------------------
if (dbConnection == null)
dbConnection = factory.CreateConnection();
// -- Renseignement de la chaine de connexion
// ------------------------------------------
if (dbConnection.State == ConnectionState.Closed)
dbConnection.ConnectionString = ConnectionStringSettings.ConnectionString;
// -- Ouverture de la connexion si cette dernière est fermée
// ---------------------------------------------------------
if (dbConnection.State == ConnectionState.Closed)
dbConnection.Open();
}
catch (Exception ex)
{
throw new Exception("GTMAccess.getDataBaseConnection : " + ex.Message + "\n");
}
return dbConnection;
} |
Ensuite j'ai développé mes classes qui permettent l'accès aux données (DAL) dans lesquelles je fais des choses de ce genre la:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
try
{
using (DbConnection dbConnection = DBAccess.Instance.getDataBaseConnection())
{
return getAllThemes(includeSubFolders, dbConnection);
}
}
catch (Exception ex)
{
throw new Exception(ex.Message + "\n");
} |
Le hic c'est que lorsque deux utilisateurs se connecte et effectuent des opérations sur le site... J'ai des message d'erreurs du style
Citation:
Un dataReader est déja ouvert.
Est ce que vous comprenez ce qui se passe ???
Merci.