此代码线程安全吗?
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对象中增加CommandTimeout值。
有任何想法吗?
最佳答案
回答您的问题,NpgsqlConnection不是线程安全的。您不应该与多个线程共享NpgsqlConnection。
但是关于异常,如果您注意到,则可以在调用NpgsqlConnection.Open()方法时得到它。在getConnection()方法中,您不会调用Open。您正在其他地方打开连接。
现在,要在打开连接时遇到此异常,必须已达到最大连接池大小。这意味着您可能没有关闭以前打开的连接。
您必须调用close或将其放置在NpgsqlConnection对象中才能使其返回连接池。如果您让NpgsqlConnection实例超出范围,它将不会返回到池中,并且将被视为已使用的连接。
为了检查这是否是您的问题,您有两种可能性:
禁用连接池。您不会再遇到此异常,但是由于没有正确关闭连接,您可能最终达到每个数据库允许的最大连接数。这是一个postgresql服务器参数。
调用NpgsqlConnection.ClearPool或ClearAllPool以便从池中删除所有连接。
请注意,这两种可能性仅应用于检查连接池是否有问题。如果使用这些方法之一后您的应用程序开始正常运行,则您的应用程序仍存在需要修复的问题。
希望对您有所帮助。