我们收到以下异常,看起来它来自Npgsql.dll
。
我们在DLL
ASP.Net
C#
服务器上托管的Ubuntu 14.04
Apache
应用中使用此mod_mono
。 DLL
负责与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
任何有助于弄清楚导致此错误的原因的人都会非常感激。
答案 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 *(核心数)线程