这个代码线程安全吗?
public static NpgsqlConnection getConnection()
{
NpgsqlConnectionStringBuilder csb = new NpgsqlConnectionStringBuilder();
csb.Host = ConfigurationManager.AppSettings["server"];
csb.Password = ConfigurationManager.AppSettings["password"];
csb.Pooling = true;
csb.UserName = ConfigurationManager.AppSettings["username"];
csb.Port = Convert.ToInt32( ConfigurationManager.AppSettings["port"]);
csb.Enlist = true;
//csb.Database = ConfigurationManager.AppSettings["databaseName"];
return new NpgsqlConnection(csb.ConnectionString);
}我在任何地方都使用这种连接,但有时我会得到一个TimeoutException。
超时已经发生。如果要建立连接,请在ConnectionString中增加超时值。如果正在执行命令,则在ConnectionString或NpgsqlCommand对象中增加NpgsqlCommand值。
有什么想法吗?
发布于 2013-12-12 17:12:51
在回答您的问题时,NpgsqlConnection并不是线程安全。您不应该与多个线程共享NpgsqlConnection。
但是对于异常,如果您注意到,则在调用NpgsqlConnection.Open()方法时会得到它。在getConnection()方法中,不调用Open。你在其他地方打开连接。
现在,要在打开连接时获得此异常,必须达到最大连接池大小。这意味着您可能没有关闭以前打开的连接。
您必须在NpgsqlConnection对象中调用close或dispose才能将其返回到连接池。如果允许NpgsqlConnection实例超出作用域,它将不会返回到池中,并将被视为已使用的连接。
为了检查这是否是您的问题,您有两种可能性:
请注意,这两种可能性只应用于检查是否存在连接池问题。如果您的应用程序在使用这些方法之一后开始正常工作,则您的应用程序仍然存在需要修复的问题。
希望能帮上忙。
发布于 2013-12-04 10:59:38
不,这不是线程安全,因为csb不是本地的,很可能也不是线程安全的。使用当地的csb。检查ConfigurationManager是否线程安全。
实例化连接本身是线程安全的,因为其他线程无法“看到”实例。你的连接问题可能来自其他地方。您可能希望尝试在错误消息中给出的提示。
https://stackoverflow.com/questions/20373282
复制相似问题