Assurez-vous que NHibernate SessionFactory n'est créé qu'une seule fois
J'ai écrit une NHibernateSessionFactory classe qui détient une statique Nhibernate ISessionFactory. Ce est utilisé pour s'assurer que nous n'avons qu'une seule session de l'usine, et la première fois OpenSession() est appelé, je créer le actuall SessionFactory - la prochaine fois je utiliser le même et ouvrir une session sur elle. Le code ressemble à ceci:
public class NhibernateSessionFactory : INhibernateSessionFactory
{
private static ISessionFactory _sessionFactory;
public ISession OpenSession()
{
if (_sessionFactory == null)
{
var cfg = Fluently.Configure().
Database(SQLiteConfiguration.Standard.ShowSql().UsingFile("Foo.db")).
Mappings(m => m.FluentMappings.AddFromAssemblyOf<MappingsPersistenceModel>());
_sessionFactory = cfg.BuildSessionFactory();
BuildSchema(cfg);
}
return _sessionFactory.OpenSession();
}
private static void BuildSchema(FluentConfiguration configuration)
{
var sessionSource = new SessionSource(configuration);
var session = sessionSource.CreateSession();
sessionSource.BuildSchema(session);
}
}
Maintenant j'ai un problème. Mon application est divisée entre le client et le serveur. Le Nhibernate des choses est sur le côté serveur. Au démarrage de mon serveur et client veut accéder à la base de données par le biais de certains services qui va utiliser le NhibernateSessionFactory. Le résultat est une condition de course à savoir si le _sessionFactory est créé avant que la demande vient de la part du client. Si elle ne l'est pas, il va échouer..
Je suppose que j'ai besoin d'une sorte de queue ou d'attendre le mécanisme de la NhibernateSessionFactory, mais je ne suis pas sûr de savoir quoi faire. Quelqu'un a eu le même problème avant? Quelle est la meilleure solution?
source d'informationauteur stiank81
Vous devez vous connecter pour publier un commentaire.
La
sessionFactory
doit être thread-safe singleton.Un modèle commun en Java est de construire le
sessionFactory
dans un initialiseur statique. Voir HibernateUtil. Vous pouvez faire la même chose en C#.Il y a d'autres modèles à mettre en œuvre singleton, y compris l'utilisation de la serrure ou synchronisé des sections. Ici est une légère variante de ce qui devrait résoudre votre problème si j'ai bien compris.
J'ai résolu ce problème en utilisant un Mutex lors de la création de la SessionFactory. Est-ce à paraître raisonnable:
Semble fonctionner comme un charme. Mais dois-je utiliser le verrou à la place?