【问题标题】:Npgsql timeout exception on mono单声道上的 Npgsql 超时异常
【发布时间】:2015-06-29 11:18:00
【问题描述】:

我们收到以下异常,它看起来像是源自Npgsql.dll

我们在ASP.Net C# 托管在Ubuntu 14.04 服务器上的Apache mod_mono 下的应用程序中使用此DLLDLL 负责与Postgresql Server 交谈。我们在服务器上安装了最新版本的Postgresql

此错误随机发生然后导致服务器崩溃。

System.Web.HttpUnhandledException: Exception of type 'System.Web.HttpUnhandledException' was thrown. ---> Npgsql.NpgsqlException:
Failed to establish a connection to 'localhost'.
  at Npgsql.NpgsqlClosedState.Open (Npgsql.NpgsqlConnector context, Int32 timeout) [0x00000] in <filename unknown>:0
  at Npgsql.NpgsqlConnector.Open () [0x00000] in <filename unknown>:0
  at Npgsql.NpgsqlConnectorPool.GetPooledConnector (Npgsql.NpgsqlConnection Connection) [0x00000] in <filename unknown>:0
  --- End of inner exception stack trace ---
  at System.Web.UI.Page.ProcessException (System.Exception e) [0x00000] in <filename unknown>:0
  at System.Web.UI.Page.ProcessRequest (System.Web.HttpContext context) [0x00000] in <filename unknown>:0
  at ASP.default_aspx.ProcessRequest (System.Web.HttpContext context) [0x00000] in <filename unknown>:0
  at System.Web.HttpApplication+<Pipeline>c__Iterator1.MoveNext () [0x00000] in <filename unknown>:0
  at System.Web.HttpApplication.Tick () [0x00000] in <filename unknown>:0

System.TimeoutException: Dns hostname lookup timeout. Increase Timeout value in ConnectionString.
  at Npgsql.NpgsqlClosedState.Open (Npgsql.NpgsqlConnector context, Int32 timeout) [0x00000] in <filename unknown>:0 

任何有关找出导致此错误的原因的帮助将不胜感激。

【问题讨论】:

  • 看起来“localhost”的 DNS 主机名查找超时。也许不是使用 DNS,而是在连接字符串中使用环回 IP 127.0.0.1。
  • Thanx @RonBeyer - 如果您将此作为答案发布,如果可行,我可以接受。
  • 完成!让我们知道它是否成功。
  • @ShaneVanWyk 你找到解决方案了吗?
  • 不,它自己修复了。 Npgsql 有时可能是不确定的。如果您使用的是单声道,请确保 mono.security 在您的 bin 中

标签: c# postgresql mono ubuntu-14.04 npgsql


【解决方案1】:

“localhost”的 DNS 主机名查找似乎超时。也许不是使用 DNS,而是在连接字符串中使用环回 IP 127.0.0.1。

【讨论】:

  • 已将其更改为 127.0.0.1 但没有任何区别,而是现在显示为 Failed to establish a connection to '127.0.0.1'
【解决方案2】:

你应该像这样运行你的应用程序

MONO_THREADS_PER_CPU=50 mono MyApp.exe

原因是npgsql 2.2.7版本中使用了ThreadPool,也因为里面的socket也使用了ThreadPool。 Npgsql 在打开使用 ThreadPool 的连接时使用 GetHostEntryAsync 方法来解析主机名。即使您在连接字符串中显式指定 ip,npgsql 也会调用 BeginConnect 套接字方法,该方法是异步的,并且将使用 ThreadPool。默认情况下,在单声道中,每个 CPU 核心池中的线程数为 1。而在 .net 中还有其他算法。结果,池中的线程开始变短,mono环境开始缓慢发出它们。

当每个核心的线程数很少时,池不会发出现有的就绪线程并创建一个新的,创建需要很长时间。使用 MONO_THREADS_PER_CPU 参数,我们告诉单声道运行时在池 N *(内核数)线程中保持就绪

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-10
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    相关资源
    最近更新 更多