单声道上的Npgsql超时异常

时间:2015-04-22 02:34:08

标签: c# postgresql mono ubuntu-14.04 npgsql

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

我们在DLL ASP.Net C#服务器上托管的Ubuntu 14.04 Apache应用中使用此mod_monoDLL负责与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 

任何有助于弄清楚导致此错误的原因的人都会非常感激。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

MONO_THREADS_PER_CPU=50 mono MyApp.exe

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

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