我目前正在ASP.net 2.0应用程序上进行一些GUI测试.RDBMS是SQL Server 2005.主机是Win Server 2003/IIS 6.0.
我没有应用程序的源代码,因为它是由一个没有发布代码的外部公司编写的.
我注意到当我重新启动IIS时应用程序运行良好但经过一些测试后,在我打开并关闭浏览器几个小时之后,应用程序开始变得越来越慢.我想知道这种行为是否是由于程序员关闭连接错误造成的:我怀疑这里的数据库是否存在开放连接泄漏.
我想.Net垃圾收集器最终将关闭它们但是......这可能需要一段时间,不是吗?
我有SQL Server Management Studio,我从活动监视器中注意到数据库上打开了很多连接.
从以上所述,以下是与主要问题相关的一些问题:
有没有办法在SQL Server 2005中知道连接是否打开是因为它们等待在连接池中使用,或者它们是否因为应用程序使用它们而打开?
somone是否知道良好的在线/纸质资源,我可以学习如何使用性能计数器或其他类型的工具来帮助追踪这类问题?
如果性能计数器是最佳解决方案,那么我应该注意哪些变量?
sql-server asp.net connection-pooling performancecounter connection-leaks
我希望在我们的系统中实现ORM.我们目前有很多表,有很多可怕的数据和存储过程.我听说使用ORM会降低系统速度.有没有人知道哪个ORM使用在C#代码中创建的查询并映射到存储过程的速度和性能更好?
谢谢
编辑:
该项目将使用大型且包含大量数据的现有表,它还将使用在SQL Server DB中执行复杂任务的现有存储过程.在运行现有存储过程和查询当前表时,ORM必须能够执行事务并具有高性能.该项目是基于Web的,将使用带有DDD的WCF Web服务.我可以看到EF更容易使用并且有更大的支持,但如果NH是最合适的选择吗?
在我的代码中,我曾经使用加载相关实体await FindAsync,希望我更好地符合c#async指南.
var activeTemplate = await exec.DbContext
.FormTemplates.FindAsync(exec.Form.ActiveTemplateId);
Run Code Online (Sandbox Code Playgroud)
并且它运行缓慢,在sql server profiler中速度很慢,查询文本在SSMS中很快.花了5秒钟才获取此行.
替代方案:
var activeTemplate = exec.Form.ActiveTemplate;
Run Code Online (Sandbox Code Playgroud)
要快得多.无论如何,问题似乎不是参数嗅探,因为快速和慢速查询中的读取次数是相同的.
一个可能无关紧要的点是被提取的对象包含一个包含~1MB文本的字符串属性.该应用程序是asp.net mvc,与sql server在同一台计算机上运行,使用(local)连接.
观察到的缓慢是什么原因?
编辑:@ jbl评论后,我做了一些实验:
var activeTemplate = await exec.DbContext.FormTemplates
.FirstOrDefaultAsync(x => x.Id == exec.Form.ActiveTemplateId); // slow
var activeTemplate = exec.DbContext.FormTemplates
.FirstOrDefault(x => x.Id == exec.Form.ActiveTemplateId); // fast
Run Code Online (Sandbox Code Playgroud) 我修改了一个 Github 项目来测试一些与实体框架相关的查询方式。
楷模:
[Table("Player")]
public partial class Player
{
public int Id { get; set; }
[Required]
[StringLength(200)]
public string FirstName { get; set; }
[Required]
[StringLength(200)]
public string LastName { get; set; }
public DateTime DateOfBirth { get; set; }
public int TeamId { get; set; }
public virtual Team Team { get; set; }
}
[Table("Team")]
public partial class Team
{
public Team()
{
Players = new HashSet<Player>();
}
public int Id { get; set; } …Run Code Online (Sandbox Code Playgroud) 给定一个实体和一个 DbContext,如下所示:
public class Entity
{
public int Id {get;set;}
public string LargeString {get;set;}
}
public class MyDbContext : DbContext
{
public DbSet<Entity> Entities {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
数据库中存储的实体有Id42 个,并LargeString包含约 2 兆字节的 XML。以下内容需要半分钟左右,有时会给出OutOfMemoryException:
using (var dbContext = new MyDbContext())
{
var entity = await dbContext.Entities.SingleAsync(e => e.Id == 42);
}
Run Code Online (Sandbox Code Playgroud)
同时,以下 Dapper 查询以毫秒为单位执行:
using (var dbContext = new MyDbContext())
{
var entity = await dbContext.Database.Connection
.Query<Entity>("SELECT Id, LargeString FROM Entities WHERE Id = 42")
.SingleAsync();
} …Run Code Online (Sandbox Code Playgroud) 我遇到了一种情况,需要非异步运行单个LINQ 查询。原因:目前异步 EF 调用加载大 blob 的方式仍然存在错误(有关实体框架异步操作需要十倍时间才能完成的更多信息)
因此,修复上述错误的选择是将查询转换为自定义 DbCommand 并异步运行原始 SQL,或者我可以将调用ToListAsync从ToList.
TLDR ---问题:
我知道同步调用异步代码可能会导致死锁(例如query.ToListAsync().Result),但是,在异步方法内部调用 ToList 的非异步版本是否会出现相同的问题?
c# ×4
async-await ×2
sql-server ×2
asp.net ×1
asynchronous ×1
deadlock ×1
nhibernate ×1
performance ×1