- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到一个问题,DAL2 存储库的默认 Get() 函数需要几秒钟才能返回结果。当我使用 SQL Server Management Studio 直接查询数据库以获取记录时,查询会快速返回。该函数是一个基本函数,如下所示:
public MyThing Get(string primaryKey)
{
MyThing myThing;
using (IDataContext ctx = DataContext.Instance(“DATABASECONN”))
{
var rep = ctx.GetRepository<MyThing>();
myThing = rep.GetById(primaryKey);
}
return myThing;
}
该表有 80 万多个条目。
即使启用缓存设置,该函数在后续执行中具有相同的执行时间。
为什么它运行缓慢,我怎样才能加快它的速度?
最佳答案
我在调试代码时在数据库上运行了 SQL Profiler。它显示第一次调用 GetById() 函数时,执行了从数据库表中选择所有记录的查询。主键未传递到数据库。下次执行 GetById() 函数时,不再查询数据库。结果从缓存值返回。
因此,从 GetById() 函数返回的单个记录必须是对表中所有记录的结果集进行某种搜索的结果。这个函数如何操作和检索记录的细节在编译代码中(这个编译代码的源代码可能是可用的,但我还没有调查它)。
我查看了这段代码执行期间的内存使用情况,以确保 IIS 有足够的内存量。 IIS 中的设置已设置为允许应用程序池使用可用内存。调试 w3wp.exe 进程的内存使用量在 0.75 到 1.3 GB 之间波动。有大量可用的额外 RAM,因此网站可以根据需要使用更多内存。
这些实验的亮点是:
为了解决这个问题,我改变了我的方法。在SELECT中直接使用主键查询数据库时,查询返回很快。这导致我使用 DAL2 存储库的 Find() 函数,这样我就可以自己指定 SELECT 的条件。
我创建的函数如下所示:
public MyThing Get(string primaryKey)
{
MyThing myThing = (MyThing)DataCache.GetCache(primaryKey);
if (myThing != null)
return myThing;
IList<MyThing> myThings;
using (IDataContext ctx = DataContext.Instance(“DATABASECONN”))
{
var rep = ctx.GetRepository<MyThing>();
myThings = (IList<MyThing>)rep.Find("WHERE myPrimaryKeyFieldName = @0", primaryKey);
if (myThings.Count > 0)
DataCache.SetCache(primaryKey, myThings[0]);
}
return myThings.Count > 0 ? myThings[0] : null;
}
上面的函数使用了 Find() 函数,因此 DAL2 没有实现缓存。为了解决这个问题,我使用了自定义缓存技术。使用 SQL Profiler 调查此函数表明,使用相同的 primaryKey 值重复调用该函数不会命中数据库,因此缓存的行为符合预期。
以这种方式使用缓存不会像使用 GetById() 时那样减慢执行时间。放置在函数中的日期时间用作计时器,显示以下执行时间。当数据库被命中时,00:00:00.1 或更少。当缓存被命中时,执行时间为 0。这没有进行大规模测试,但执行时间在我运行的测试中是一致的。
以上测试和解决方案说明DAL2中的GetById()要慎用。根据数据库的大小检索记录不一定是最佳解决方案。如果数据检索执行缓慢,请探索替代方法,例如解决方案中建议的方法。
找出 GetById() 不再是最佳解决方案的表中记录的确切数量会很有帮助。此数字可能因对象中数据的大小而异。它可能是可计算的,但目前没有方程式,因此需要根据具体情况计算。
如果其他人有关于此主题的额外信息,请将其添加到讨论中。
关于sql - 为什么 DNN 中 DAL2 存储库的默认 GetById() 执行缓慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20011547/
我正在使用 Entity Framework 并希望在 Repository 类中创建通用的 GetById 方法并进行预加载: 这是我使用延迟加载的方法: public virtual TEntit
因此,我使用带有 asp.net core 和 Entity Framework 6 的存储库模式从服务层访问数据库。问题是我有一个具有复合键的实体,而通用存储库采用 int 作为参数,因此我无法将多
我没有像 here 那样在数据存储读取上获得强一致性. 代码(使用Objectify)。 a = getById() // ofy().load().type(this.clazz).id(id).n
请参阅以下文章:https://www.codeproject.com/Articles/555855/Introduction-to-CQRS和 http://enterprisecraftsman
我的理解是您必须编写隔离功能的单元测试。因此,给定一个具有此方法的存储库类: Entity GetById(Guid id) 和一个假实现(使用字典进行存储),如果不先添加实体,您将如何编写测试?可以
我正在寻找一种创建通用 GetById 的方法,它将 params object[] 作为参数,知道找到键/s 字段并知道找到相关实体。 在寻找解决方案的过程中,我想到了一个返回 PK 字段定义的泛型
其次,我使用 raphaeljs 库在不同路径中进行了 SVG 形式转换。 我想通过raphaeljs 2.1.0 => getById(id); 的功能调用他来获取路径但是 Chrome 或 Fir
我将检查是否存在具有特定 id(我将其命名为“setid”)的元素。如果没有创建它并设置 id。不幸的是这不起作用。错误在哪里? 提前致谢。亚历克斯 var resultSet; var setId
这个问题已经有答案了: "document.getElementByClass is not a function" (12 个回答) 已关闭 7 年前。 我一直在使用以下代码来替换页面上 id 内的
我的 Sequelize 模型中有以下类方法: getById(id) { return new Promise((resolve, reject) => { var
我正在尝试使用 mgo (mongodb) 创建一个简单的 CRUD。 这是我的代码: package main import ( "fmt" "time" "gopkg.in
我有一个通用存储库,我正在尝试为我的单元测试创建最小起订量实现。我需要创建一个 GetById 方法。这是我决定将其转换为使用泛型之前的最小起订量实现。 mockUserRepository.Se
因此,如果用户使用屏幕足够大的设备(例如三星 Galaxy Tab),我会看到 2 个 fragment 。。 现在我正在显示 fragment 列表两次(同一 fragment 两次)。在 frag
public abstract class GenericRepository : IDisposable, IGenericRepository where T : class { prot
我正在尝试为我目前正在处理的基于 Entity Framework 的项目编写一个通用的通用存储库模式模板类。 (高度简化的)界面是: internal interface IRepository w
我正在尝试实现一个通用的 GetById(T id) 方法,该方法将满足可能具有不同 ID 类型的类型。在我的示例中,我有一个实体,其 ID 类型为 int,其中一个 ID 类型为 string。 但
我在我的应用程序中使用 CKeditor-4,在我的编码中我想通过它的 id 获取元素。下面的代码在 FF 和 IE 中返回元素,但在 Google Chrome 中返回 null。 var ele
我尝试使用 getById() 函数获取 Raphaël 对象,但是无论我尝试什么,该函数都会返回 null。 这是我正在使用的 Raphaël JS 代码: // Creates canvas 32
我知道有一个问题名为:Ember data: what is difference between find and findById? .但是,如果我错了,请更正,但我认为它与旧版本的 Ember
我正在尝试使用 Entity Framework 实现通用存储库。 我的存储库定义为: public class GenericRepository : IRepository where T
我是一名优秀的程序员,十分优秀!