Tôi đã viết một lớp NHibernateSessionFactory có chứa một ISessionFactory Nhibernate tĩnh. Điều này được sử dụng để đảm bảo rằng chúng ta chỉ có một phiên làm việc của nhà máy, và lần đầu tiên OpenSession() được gọi là tôi tạo phiên làm việc SessionFactory - lần sau tôi sử dụng cùng một phiên và mở một phiên làm việc đó. Mã trông giống như sau:Đảm bảo NHibernate SessionFactory chỉ được tạo một lần
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);
}
}
Bây giờ tôi gặp sự cố. Ứng dụng của tôi được chia giữa máy khách và máy chủ. Các công cụ Nhibernate là ở phía máy chủ. Khi khởi động, cả máy khách và máy chủ của tôi đều muốn truy cập cơ sở dữ liệu thông qua một số dịch vụ sẽ sử dụng NhibernateSessionFactory. Kết quả là một điều kiện chủng tộc cho dù _sessionFactory được tạo ra trước khi yêu cầu đến từ máy khách. Nếu nó không phải là nó sẽ thất bại ..
Tôi đoán tôi cần một số loại xếp hàng hoặc chờ cơ chế trong NhibernateSessionFactory, nhưng tôi không chắc chắn về những gì để làm. Bất cứ ai cũng có cùng một vấn đề trước đây? Giải pháp tốt nhất là gì?
Cảm ơn! Nghe có vẻ hợp lý. Tôi vừa thêm một giải pháp sử dụng Mutex. Nhưng tôi nên sử dụng khóa thay thế? – stiank81
Nhưng nếu tôi cần nhiều kết nối cơ sở dữ liệu cùng một lúc thì sao? Hiện tại tôi không biết cách giải quyết khác này để tạo nhiều Nhà máy phiên ... – JustAMartin
Làm thế nào để bạn thực hiện điều này trong bộ điều khiển? – Chazt3n