2

我已经使用 SubSonic 2 大约 5 年了,并且很喜欢它。然而,在过去的六个月里,我一直在考虑迁移到 SubSonic 3 或类似的 ORM 工具。由于我的公司使用了大量 Telerik 的工具,我想我会尝试 OpenAccess。配置好之后,我想我会尝试一个非常基本的任务,即从我们的用户表(约 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 在第一次访问时要快得多,但每次页面刷新大约需要 65 毫秒?

如果这是一个“基本”问题,或者我没有充分测试性能,我深表歉意。如果有任何方法可以改进此方法,我将不胜感激任何建议。

谢谢,安德鲁

4

3 回答 3

4

OpenAccess 有一个内部数据库对象,该对象在您第一次创建 OpenAccessContext 时创建。它基本上计算所有默认值,创建缓存,初始化其他基础设施对象等。一旦创建,它就会存储在内部静态字典中(其中 connectionID 是键)。

创建的所有其他上下文都将使用该内部对象,并且根本没有开销。话虽这么说 1600 毫秒有点高,您可能会考虑更改映射类型(xml 是最佳的,性能方面)。

优化将确保模型在应用程序启动处理程序中初始化。下面的代码应该可以解决问题。

void Application_Start(object sender, EventArgs e)
{
    var modelInfo = new EntitiesModel().Metadata;
}

编辑:作为后续,它说 0 毫秒,这实际上不是查询执行时间。查询返回的是稍后执行的 IQueryable。您必须调用 ToList() 才能获取真实数据。

于 2012-02-22T10:29:35.123 回答
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);

托马斯

于 2012-02-22T09:32:33.500 回答
0

不知道这是否离题,但在过去的几年里,我一直在使用 SS2 和 SS3 并为其做出贡献。我刚刚完成了大修并在 SS2 中添加了 MsAccessProvider,在 SS2 和 SS3 中添加了 Enum 生成器(这些已提交并位于项目页面)。

我还为 SS3 组合了我自己的缓存框架,它允许从任何唯一索引引用的数据库中的表中自动选择性地缓存数据(作为通用字典)。我能够为基于模板的网页生成缓存查找数据,并将使用 SS3 LINQ 查找的响应时间从大约 2 分钟缩短到几分之一秒。(我没有公开发布过)

我只是不确定在哪里发布这些东西以引起 SS 用户的注意。我对未决问题的来源和关闭的承诺产生了完全零响应。

于 2012-03-02T12:22:34.937 回答