首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >这个NpgsqlConnection工厂线程安全吗?

这个NpgsqlConnection工厂线程安全吗?
EN

Stack Overflow用户
提问于 2013-12-04 10:48:04
回答 2查看 3.9K关注 0票数 4

这个代码线程安全吗?

代码语言:javascript
运行
复制
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值。

有什么想法吗?

EN

回答 2

Stack Overflow用户

发布于 2013-12-12 17:12:51

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

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

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

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

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

  1. 禁用连接池。您将不再获得此异常,但由于没有正确关闭连接,您可能最终会达到每个数据库允许的最大连接。这是postgresql server参数。
  2. 调用NpgsqlConnection.ClearPool或ClearAllPool,以便从池中删除所有连接。

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

希望能帮上忙。

票数 4
EN

Stack Overflow用户

发布于 2013-12-04 10:59:38

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20373282

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档