Npgsql nhibernate 57014 由于语句超时取消语句

问题描述 投票:0回答:2

我在使用 Npgsql 的一些查询中遇到随机错误。

这里是堆栈跟踪:

at NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Loader\Loader.cs:line 1597
   at NHibernate.Loader.Loader.ListIgnoreQueryCache(ISessionImplementor session, QueryParameters queryParameters) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Loader\Loader.cs:line 1497
   at NHibernate.Loader.Loader.List(ISessionImplementor session, QueryParameters queryParameters, ISet`1 querySpaces, IType[] resultTypes) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Loader\Loader.cs:line 1487
   at NHibernate.Impl.SessionImpl.List(CriteriaImpl criteria, IList results) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\SessionImpl.cs:line 1955
   at NHibernate.Impl.CriteriaImpl.List(IList results) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\CriteriaImpl.cs:line 265
   at NHibernate.Impl.CriteriaImpl.List[T]() in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\CriteriaImpl.cs:line 276
   at LAVASPORT.DAO.MigrarCadeteDAO.findByCompania(Compania compania, String conexion, DateTime fechainicial, DateTime fechafinal) in D:\Aplicaciones\LavaSport\LAVASPORT\DAO\MigrarCadeteDAO.cs:line 125

这是消息

InnerException = {"57014: canceling statement due to statement timeout"}

我不是一直都遇到这种异常,一天只有 1 到 2 次。大多数发送异常的特殊查询是高容量查询。

这里是查询:

public IList<Cadete> findByCompania(Compania compania, String conexion,DateTime fechainicial,DateTime fechafinal)
        {
            try
            {
                DateTime fechaini = new DateTime(fechainicial.Year, fechainicial.Month, fechainicial.Day);
                DateTime fechafin = new DateTime(fechafinal.Year, fechafinal.Month, fechafinal.Day);
                var nhConfig = new Configuration().Configure(conexion);
                var sessionFactory = nhConfig.BuildSessionFactory();
                var session = sessionFactory.OpenSession();
                session.BeginTransaction();
                var query = session.CreateCriteria<Cadete>();
                query.CreateAlias("compania", "compania");
                query.Add(Restrictions.Eq("compania.id", compania.id))
                     .Add(Restrictions.Lt("fechaIngreso", fechafin))
                     .Add(Restrictions.Ge("fechaIngreso",fechaini));
                IList<Cadete> cadetes = query.List<Cadete>();
                return cadetes;
            }
            catch (Exception ex)
            {
               MessageBox.Show("Error : " + ex.Message);
            }
            return null;
        }

这是我的 NHibernate 配置和我的 Web 配置文件:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" >
  <session-factory name="LAVASPORT">
    <property name="connection.driver_class">NHibernate.Driver.NpgsqlDriver</property>
    <property name="connection.connection_string">
      Server=localhost;database=LAVASPORT;user id=postgres;password=admin;MaxPoolSize=500;TimeOut=1000;
    </property>
    <property name="dialect">NHibernate.Dialect.PostgreSQLDialect</property>
    <property name="show_sql">true</property>
    <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
    <mapping assembly="LAVASPORT"/>
  </session-factory>
</hibernate-configuration>

如果我将超时增加到超过 1000,我每次都会在连接上出错。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>
    <section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate"></section>
  <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --></configSections>
  <startup> 
      <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1"/>
  </startup>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0"/>
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer"/>
    </providers>
  </entityFramework>
  <system.transactions>
    <defaultSettings timeout="10:00:00" />
  </system.transactions>
</configuration>

我真的很感激任何帮助。

postgresql nhibernate npgsql
2个回答
1
投票

首先,请注意

Timeout
连接字符串参数管理 connection 超时(即
NpgsqlConnection.Open()
)而不是命令执行超时。默认命令执行超时通过
Command Timeout
连接字符串参数进行管理。

除此之外,您的命令似乎只是超时。由于默认命令超时为 30 秒,因此您的查询、数据库索引或其他方面似乎存在一些严重的性能问题。您需要仔细分析 NHibernate 创建的 SQL 以及 PostgreSQL 是如何执行它的。


0
投票

SET statement_timeout=60000;

在 SELECT 为我解决这个问题之前

© www.soinside.com 2019 - 2024. All rights reserved.