我昨天开始运行这个庞大的系统。成千上万的人同时连接..我正在使用SQL Server 2008和.NET 3.5(C#);
今天我注意到我的数据库服务器变得非常慢(顺便说一句,服务器机器确实能够轻松地处理10x这个应用程序,所以我必须弄乱我的连接或其他东西)。
首先:我的Business类正在创建每个只有一个DataContext。在课堂上,像这样:
public class BusProduct : IDisposable
{
//DataContext
DBDataContext db = new DBDataContext();
//Variable of type DAL.Products (that will be set on application level)
public Products _attributes { get; set; }
//Dispose
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
db.Dispose();
}
}
/// Constructor
public BusProduct()
{
try
{
//New object
_attributes = new Product();
}
catch (Exception ex)
{
throw new Exception(ex.Message,ex);
}
}
public void Insert()
{
try
{
//Insert data set on _attributes
db.Products.InsertOnSubmit(_attributes);
db.SubmitChanges();
}
catch (Exception ex)
{
throw new Exception(ex.Message,ex);
}
}
}
你们对此有什么想法(每个类一个DataContext)?你会建议什么?这对大班有用吗?它甚至好吗?
我喜欢这样做主要是因为像IQueryable<Type>
这样的回报。 (当尝试访问此类返回时,如果我为每个方法使用一个DataContext
,则它将被处理掉)
答案 0 :(得分:5)
你们对此有什么想法(每个类一个DataContext)?
你做的事情在很多层面都是错误的,这并不好玩 - 例如,你如何在一个交易中同步多个类的更新? 200个更新的分布式事务只是因为您不关心正确的连接处理?这非常昂贵。你如何处理多个类之间的连接和项目?您强制使用不同的数据上下文(每个类一个),这将导致底层提供程序无法进行优化 - 而不是技术上不可能,但我确信开发人员只会告诉您在被问到为什么时会正确起诉这些内容没有照顾它。
这将需要完全重写才能采用合理的方法 - 在页面启动时打开连接,在页面结束时关闭它。好吧,如果你需要单独的数据库事务,有时不止一个,但通常是 - 不。
另外,请获取其中一本初学者书籍,告诉您有关存储库模式的信息。我们通过DataManager运行所有数据库访问。
DataManager包含连接,实现类似于Entu的东西,它是IQueryable。在开始时打开一个,根据需要使用它,完成。