此代码线程安全吗?

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以便从池中删除所有连接。


请注意,这两种可能性仅应用于检查连接池是否有问题。如果使用这些方法之一后您的应用程序开始正常运行,则您的应用程序仍存在需要修复的问题。

希望对您有所帮助。

09-28 00:55