我使用SubSonic 2已经有5年了,并且喜欢它。然而,在过去的六个月里,我一直在想要转向SubSonic 3或类似的ORM工具。由于我的公司使用了大量Telerik的工具,我想我会尝试OpenAccess。配置完成后,我想我会尝试一个非常基本的任务,即使用Users表中的信息(约30条记录)加载RadGrid。
因此,在Grid的OnNeedDataSource事件中,我有以下内容:
var start = System.Environment.TickCount;
context = new EntitiesModel();
rgUsers.DataSource = (from u in context.Users select u);
var stop = System.Environment.TickCount;
var elapsed = stop - start;
litTelerik.Text = string.Format("This process took <b>{0}</b> milliseconds", elapsed);
在构建并运行页面后,它会向后吐出1607毫秒。但是,刷新页面后,它会返回0秒。 (为什么?)
然后我输入了SubSonic代码:
var start = System.Environment.TickCount;
rgUsers.DataSource = new UserCollection().Load();
var stop = System.Environment.TickCount;
var elapsed = stop - start;
litTelerik.Text = string.Format("This process took <b>{0}</b> milliseconds", elapsed);
我第一次运行代码,它说需要171毫秒。刷新页面后,它报告花了60-70ms。
所以,我的问题是:为什么在第一次访问时加载OA需要花费更长的时间,而在每次刷新页面时加载零秒?而SubSonic在第一次访问时速度要快得多,但每次刷新需要大约65ms?
如果这是一个“基本”问题,或者我没有充分测试表现,我道歉。如果有任何方法可以改进这种方法,我将非常感谢任何建议。
谢谢, 安德鲁
答案 0 :(得分:4)
OpenAccess有一个内部Database对象,它是在您第一次创建OpenAcccessContext时创建的。它基本上计算所有默认值,创建缓存,初始化其他基础结构对象等。一旦创建它,它就存储在内部静态字典中(connectionID是键)。
创建的每个其他上下文都将使用该内部对象,并且根本不会有开销。据说1600毫秒有点高,你可以考虑改变映射类型(xml是最佳的,性能明智的。)
优化是确保在应用程序启动处理程序中初始化模型。以下代码应该可以解决问题。
void Application_Start(object sender, EventArgs e)
{
var modelInfo = new EntitiesModel().Metadata;
}
编辑:作为后续,它说0毫秒,这实际上不是查询执行时间。查询返回的是后来执行的IQueryable。您必须调用ToList()才能获得真实数据。
答案 1 :(得分:1)
原因可能是在OpenAccess中打开数据库需要比在SubSonic中更长的时间。尝试执行一个简单的操作,比如在测量加载时间之前获取计数只是为了打开数据库。在SubSonic中也一样。
context = new EntitiesModel();
context.Users.Count();
var start = System.Environment.TickCount;
rgUsers.DataSource = (from u in context.Users select u);
var stop = System.Environment.TickCount;
var elapsed = stop - start;
litTelerik.Text = string.Format("This process took <b>{0}</b> milliseconds", elapsed);
托马斯
答案 2 :(得分:0)
不知道这是否属于偏离主题,但过去几年我一直在使用并为SS2和SS3做出贡献。 我刚刚完成了一次大修,并将一个MsAccessProvider添加到SS2,将Enum生成器添加到SS2和SS3(这些都已提交并在项目页面中生效)。
我还为SS3组建了自己的缓存框架,允许从任何唯一索引引用的数据库中的表自动选择性缓存数据(作为通用字典)。我能够为基于模板的网页生成缓存查找数据,并通过SS3 LINQ查找将响应从大约2分钟提高到几分之一秒。 (我没有公开发布)
我只是不确定在哪里发布这些内容以引起SS用户的注意。我对源代码的承诺以及对未决问题的结束都产生了零响应。