C# mono上的Npgsql超时异常
我们得到了以下异常,它似乎来自C# mono上的Npgsql超时异常,c#,postgresql,mono,ubuntu-14.04,npgsql,C#,Postgresql,Mono,Ubuntu 14.04,Npgsql,我们得到了以下异常,它似乎来自Npgsql.dll 我们在ASP.NetC应用程序中使用这个DLL,该应用程序托管在ubuntu14.04服务器上的Apachemod\u mono下。该DLL负责与Postgresql Server对话。我们在服务器上安装了最新版本的Postgresql System.Web.HttpUnhandledException: Exception of type 'System.Web.HttpUnhandledException' was thrown. ---&
Npgsql.dll
我们在ASP.Net
C
应用程序中使用这个DLL
,该应用程序托管在ubuntu14.04
服务器上的Apache
mod\u 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
此错误随机发生,然后使服务器崩溃
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
System.Web.HttpUnhandledException:引发了类型为“System.Web.HttpUnhandledException”的异常。-->Npgsql.NpgsqlException:
无法建立到“localhost”的连接。
在Npgsql.NpgsqlClosedState.Open处(Npgsql.NpgsqlConnector上下文,Int32超时)[0x00000]in:0
在0中的Npgsql.NpgsqlConnector.Open()[0x00000]处
在:0中的Npgsql.NpgsqlConnectorPool.GetPooledConnector(Npgsql.NpgsqlConnection Connection)[0x00000]处
---内部异常堆栈跟踪的结束---
在0中的System.Web.UI.Page.ProcessException(System.Exception e)[0x00000]处
在0中的System.Web.UI.Page.ProcessRequest(System.Web.HttpContext上下文)[0x00000]处
在0中的ASP.default_aspx.ProcessRequest(System.Web.HttpContext上下文)[0x00000]处
在System.Web.HttpApplication+c__迭代器1.MoveNext()[0x00000]中:0
位于:0中的System.Web.HttpApplication.Tick()[0x00000]处
System.TimeoutException:Dns主机名查找超时。增加ConnectionString中的超时值。
在Npgsql.NpgsqlClosedState.Open处(Npgsql.NpgsqlConnector上下文,Int32超时)[0x00000]in:0
如果您能帮助您找出导致此错误的原因,我们将不胜感激。看来“localhost”的DNS主机名查找正在超时。可能不使用DNS,而是在连接字符串中使用环回IP 127.0.0.1。您应该这样运行应用程序
MONO\u线程/CPU=50 MONO MyApp.exe
原因是npgsql版本2.2.7中使用了ThreadPool,而且中的套接字也使用ThreadPool。当打开使用线程池的连接时,Npgsql使用GetHostEntryAsync方法解析主机名。即使在连接字符串中显式指定ip,npgsql也将调用BeginConnect套接字方法,该方法是异步的,并将使用线程池。在mono中,默认情况下,池中每个CPU核心的线程数为1。而在.net中还有其他算法。结果,池中的线程开始短缺,mono环境开始缓慢地发出线程
当每个核心只有几个线程时,池不会发出现有的就绪线程,而是创建一个新的就绪线程,并且创建需要很长时间。使用MONO_THREADS_PER_CPU参数,我们告诉MONO运行时在池N*(核心数)线程中保持就绪看起来“localhost”的DNS主机名查找超时了。可能不使用DNS,而是在连接字符串中使用环回IP 127.0.0.1。Thanx@RonBeyer-如果你将此作为答案发布,如果它有效,我可以接受。完成!让我们知道它是否有效。@ShaneVanWyk你找到解决方案了吗?没有,它自己解决了。Npgsql有时可能不确定。如果您正在使用mono.security将其更改为
127.0.0.1
,但没有产生任何影响,而是现在显示无法建立到“127.0.0.1”的连接,请确保mono.security在您的bin中。