Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NHibernate-第一个查询非常慢_C#_Postgresql_Nhibernate_Fluent Nhibernate - Fatal编程技术网

C# NHibernate-第一个查询非常慢

C# NHibernate-第一个查询非常慢,c#,postgresql,nhibernate,fluent-nhibernate,C#,Postgresql,Nhibernate,Fluent Nhibernate,包含10000行的数据库表(PostgreSQL): CREATE TABLE test ( id bigserial NOT NULL, text text, CONSTRAINT test_pkey PRIMARY KEY (id) ) 课程: public class Test { public virtual int ID { get; set; } public virtual string Text { get; set; } } public cla

包含10000行的数据库表(PostgreSQL):

CREATE TABLE test
(
  id bigserial NOT NULL,
  text text,
  CONSTRAINT test_pkey PRIMARY KEY (id)
)
课程:

public class Test
{
    public virtual int ID { get; set; }
    public virtual string Text { get; set; }
}

public class TestMap : ClassMap<Test>
{
    public TestMap()
    {
        Table("test");
        Id(x => x.ID, "id");
        Map(x => x.Text, "text");
    }
}
公共类测试
{
公共虚拟整数ID{get;set;}
公共虚拟字符串文本{get;set;}
}
公共类TestMap:ClassMap
{
公共测试图()
{
表(“测试”);
Id(x=>x.Id,“Id”);
Map(x=>x.Text,“Text”);
}
}
以下是我如何查询数据库:

using (ISession session = SessionBuilder.OpenSession())
{
    Stopwatch s = new Stopwatch();

    s.Start();
    var result = session.QueryOver<Test>().Where(test => test.Text == "aaa").List();
    s.Stop();
    Console.WriteLine(s.ElapsedMilliseconds); // >150ms

    s.Restart();
    var result2 = session.QueryOver<Test>().Where(test => test.Text == "bbb").List();
    s.Stop();
    Console.WriteLine(s.ElapsedMilliseconds); // ~4ms
}
使用(ISession session=SessionBuilder.OpenSession())
{
秒表s=新秒表();
s、 Start();
var result=session.QueryOver()。其中(test=>test.Text==“aaa”).List();
s、 停止();
控制台。写入线(s.elapsedmillyses);//>150ms
s、 重启();
var result2=session.QueryOver().Where(test=>test.Text==“bbb”).List();
s、 停止();
Console.WriteLine(s.elapsedmillyses);//~4ms
}

为什么第一个查询需要这么长时间?有没有办法加快速度?

很可能是缓存。您没有可以帮助查询的索引,因此完整的表扫描是获取任一答案的唯一方法。第一个将由DB填充缓冲区和缓存(可能不用于表扫描),但O/S肯定会缓存所有或部分磁盘页。第二个查询将受益于在某些级别缓存这些页面

Craig的建议也是一个关于缓存和启动的微妙的旋转——当你第一次做任何事情时,往往会引起一点轰动,你需要找出是什么。在web应用程序中,您可以在应用程序接受请求之前进行一些启动。如果这是一个批量的事情,你不能掩饰热身,那么你可能不得不接受它,或者抛弃nHibernate


接受他的建议,并测量Hibernate中发生了什么

与数据库建立连接通常会带来开销,在这种情况下,由于连接池,您将无法看到其他查询。根据你在那里的时间安排,我想说这就是你看到的问题

此外,请确保您仅将会话工厂设置为一次,并缓存它,然后从中打开会话。我不认为您会在计时的基础上遇到这种情况,但如果配置足够小,也可能会遇到这种情况。

可能的解决方案1:
几年前我一直在研究性能问题,发现的问题是NHibernate使用的XML序列化程序的初始化。我在Jira上报告了一个bug和修复程序:

请尝试我对您的nhibernate源的修复,看看问题是否已解决。根据jira系统,该问题将在nhibernate的下一版本中修复

可能的解决方案2:

如果解决方案1不起作用,请尝试在映射中为每个类映射将动态更新和动态插入设置为true。NHibernate在编译映射时会创建所有可能的查询。

您需要进一步挖掘。在PostgreSQL中启用语句持续时间日志记录,并查看日志,查看执行时间。查看nHibernate在打开详细信息后检查其日志记录,以了解它在准备工作和元数据获取方面花费了多长时间。使用
explain analyze
查看语句的执行情况。等等。你有没有发现是什么导致了你的滞后?我在使用MS SQL server作为RDBMS时遇到类似问题。第一次查询大约需要1000毫秒。查询很简单。按用户名从数据库中提取用户对象,并且表的用户名列上有索引。@VladimirKocjancic您的数据库是否已启动并运行?因为它可能只是数据库的启动。