我在 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/