gpt4 book ai didi

c# - 如何限制 .Net Web 应用程序的 ODBC 连接数?

转载 作者:行者123 更新时间:2023-11-30 17:05:11 25 4
gpt4 key购买 nike

我在 C# 中创建了一个 .Net 3.5 Web 服务,它通过 ODBC 与 Progress OpenEdge 数据库通信。

此数据库已设置为仅允许 Web 服务正在使用的用户帐户同时连接 10 个(第三方限制)。

当 Web 服务收到大量并发请求并尝试为每个请求连接到数据库时,我遇到了一个大问题。当超过连接限制时,数据库将在几分钟内拒绝新的传入连接。

Web 服务在 Windows Server 2008 上运行。为 ODBC 驱动程序启用了连接池。

我将不得不以某种方式限制我的 Web 服务尝试建立的连接数,但我不知道如何做。我正在使用的 Progress OpenEdge ODBC 驱动程序不支持最大池大小参数。

我已经阅读了很多微软关于这个主题的文档,但我所能得出的结论是:

  • 默认启用连接池
  • 无法从我的应用程序配置连接池
  • 默认最大池大小为 100
  • 除非您使用的驱动程序支持,否则无法更改最大池大小

有人可以确认这一点,和/或建议一种方法来限制这种情况下的连接数吗?非常感谢:)

最佳答案

您可以尝试提到的 WCF 方法,或者您可以通过编程方式实现连接池。

public interface IService
{
void Execute(Action<IDbConnection> command);
T Execute<T>(Func<IDbConnection, T> command);
}

public sealed class ConnectionManager : IService
{
public const int MaxConnections = 10;

private readonly string _connectionString;
private readonly SemaphoreSlim _workers = new SemaphoreSlim(0, MaxConnections);

public ConnectionManager(string connectionString)
{
_connectionString = connectionString;
}

public void Execute(Action<IDbConnection> command)
{
lock(_workers)
{
using(var connection = new OdbcConnection(_connectionString))
{
connection.Open();
command(connection);
}
}
}

public T Execute<T>(Func<IDbConnection, T> command)
{
lock(_workers)
{
using(var connection = new OdbcConnection(_connectionString))
{
connection.Open();
return command(connection);
}
}
}
}

SemaphoreSlim 将阻止超过 10 个连接打开,假设被调用的代码没有尝试任何偷偷摸摸的尝试。

关于c# - 如何限制 .Net Web 应用程序的 ODBC 连接数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16793408/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com