.net 这是NpgsqlConnection工厂的线程安全吗?

.net 这是NpgsqlConnection工厂的线程安全吗?,.net,thread-safety,npgsql,.net,Thread Safety,Npgsql,这段代码是线程安全的吗 public static NpgsqlConnection getConnection() { NpgsqlConnectionStringBuilder csb = new NpgsqlConnectionStringBuilder(); csb.Host = ConfigurationManager.AppSettings["server"]; csb.Password = ConfigurationManager.App

这段代码是线程安全的吗

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值


有什么想法吗?

没有,这不是线程安全的,因为csb不是本地的,可能不是线程安全的。使用本地csb。检查ConfigurationManager是否是线程安全的


实例化连接本身是线程安全的,因为其他线程无法“看到”实例。你的连接问题可能来自其他地方。您可能希望尝试错误消息中给出的提示。

回答您的问题,NpgsqlConnection不是线程安全的。您不应该与多个线程共享NpgsqlConnection

但是关于您的异常,如果您注意到的话,当您调用NpgsqlConnection.Open()方法时就会得到它。在getConnection()方法中,不调用Open。您正在其他地方打开连接

现在,要在打开连接时获得此异常,必须已达到最大连接池大小。这意味着您可能没有关闭以前打开的连接

必须在NpgsqlConnection对象中调用close或dispose才能将其返回到连接池。如果让NpgsqlConnection实例超出范围,它将不会返回到池中,并将被视为已使用的连接

为了检查这是否是您的问题,您有两种可能性:

  • 禁用连接池。您将不再获得此异常,但由于未正确关闭连接,可能最终达到每个数据库允许的最大连接数。这是一个postgresql server参数

  • 调用NpgsqlConnection.ClearPool或ClearAllPool以从池中删除所有连接

  • 请注意,这两种可能性仅用于检查是否存在连接池问题。如果应用程序在使用其中一种方法后开始正常工作,则应用程序仍然存在需要修复的问题


    我希望它能有所帮助。

    什么是
    csb
    ,它是在哪里定义的?
    ConfigurationManager
    在大多数正常情况下应该可以,因为csb可能会导致问题?好的,我试试看。好提示。我已经做了优化,但它似乎完全没有意义,因为创建一个类只需要不到纳秒的时间。好的,我再次检查,csb在我的项目中是本地的。所以,问题是还有其他一些问题需要回答。我更新到npgsql 2.0.13测试版,问题似乎已经解决。应用程序已经有6天没有崩溃了,可能是什么时候崩溃的,也不是因为这个。监视连接从未超过池大小。我猜是虫子吧?不确定。。。