我正在寻找一种独立于语言的 mysql 池解决方案。我使用 PGBouncer 作为示例,因为它
MySQL 中是否有类似的东西,我可以通过安装第 3 方连接器并通过该端口连接来使用池?
我有一个连接到 SQL 的 .net 网站。只是想知道默认情况下是否启用了连接池还是我必须自己激活?
我在测试我的 Lambda 函数时遇到了一些问题。我的测试,我并行N
执行我的 Lambda 函数。在我的 lambda 函数中,我通过 Knex 检索数据库连接。我正在搞乱 db init 中的设置pool: { min: 0, max: [1 or 5] }
,这似乎修复/破坏了一些东西,这取决于我代码中的其他东西。
执行我的 lambda 函数 20 次会输出正确的结果,但是,当我达到 500 次时(我期望在生产中看到的很容易超过这个),事情开始破裂。我遇到了诸如Error: ER_CON_COUNT_ERROR: Too many connections
, 之类的错误Error: pool is draining and cannot accept work
(如果我knex.destroy()
在 lambda 函数的末尾使用 Knex 的接口)。在 AWS Lambda 和 RDS 中处理连接和池以实现规模化的正确方法是什么?如果我在 AWS 上运行相同的压力测试,我在本地机器上看到的问题是否会重现?
我们有一个大部分时间运行良好的公共前台网站。但我们有时会遇到连接高峰(例如在邮件活动之后),并且我们会收到如下错误:
超时已过。从池中获取连接之前超时时间已过。发生这种情况的原因可能是所有池连接都在使用中并且已达到最大池大小
我们非常确定所有连接都已正确关闭(没有连接泄漏)。
因此我们决定增加池中允许的连接数(默认为 100)。
我们将其增加到 1000(max pool size=1000;
在我们的连接字符串中),现在我们的站点可以处理大多数连接峰值。(我精确地说该网站在专用服务器上运行)
我的问题是:最大连接池的增加可能会产生哪些负面影响?
编辑:这是我在这些高峰期间使用 sp_who2 时所得到的:
如果最大池设置为 100,则我有超过 100 行“等待命令”行:
SPID | 地位 | 登录 | 主机名 | 块通过 | 数据库名称 | 命令 | 中央处理器时间 | 磁盘IO | 最后一批 | 程序名称 | SPID | 请求ID |
---|---|---|---|---|---|---|---|---|---|---|---|---|
数字 | 睡眠 | 数据库用户 | 我网站的 IIS 池名称 | 。 | 我的数据库名称 | 等待命令 | 0 | 0 | 05/10 14:48:59 | .Net SqlClient 数据提供程序 | 137 | 0 |
我可以看到所有“LastBatch”都是在几秒钟前执行的。
一位同事告诉我,连接到数据库的成本很高,而且可能会损害应用程序的性能。他们让我创建一个调用另外 8 个过程的过程,这样他们调用一个过程并取回 8 个数据集。从我的角度来看,SQL 必须等待每个数据集返回,然后才能开始检索下一个数据集,这样也会产生负面影响。
任何人都可以量化应用程序的连接成本,并让我知道最好的方法是调用多个过程还是一个主过程?
performance sql-server-2008 sql-server connection-pooling connections
我们有一个实时的 ASP.Net 应用程序,它被大约 1000 个并发用户使用。在这个应用程序中,我们使用了连接池。在 web.config 中定义了 2 个不同名称的连接字符串,但我们正在调用相同的数据库。
<add key="connection1" value="server=1.1.1.1;USER ID=**;pwd=**;database=test;Max Pool Size=500;Min Pool Size=50;Connection Timeout = 300; Pooling='true'" />
<add key="connection2" value="server=1.1.1.1;USER ID=**;pwd=**;database=test;Max Pool Size=500;Min Pool Size=50;Connection Timeout = 300; Pooling='true'"/>
Run Code Online (Sandbox Code Playgroud)
在我的应用程序中,我们正在打开一个关闭连接的每个地方,如下所示
try{
if (connection.State == ConnectionState.Closed)
{
connection.Open();
}
}
catch(Exception ex)
{
}
finally{connection.close()}
Run Code Online (Sandbox Code Playgroud)
现在的问题是当我使用 sp_who2 检查数据库时,我看到大约 1000 或更多的睡眠会话,并且每个记录程序名称是“.Net sql server Provider”。我浏览了 MSDN,发现如果我们使用连接池,那么连接会保持打开状态直到 4-8 分钟。所以我现在有点困惑,如果我只使用 2 个连接字符串和连接池,那么为什么我们看到这么多休眠连接,我想它应该只有 2 个?有人可以在这种情况下帮助我并提出正确的建议吗?我们怎样才能最大限度地减少睡眠时间。也不确定是应用程序池(IIS 服务器)错误还是应用程序错误?请帮忙。
谢谢,
我从我的 .net 应用程序中收到以下错误。
Source: xxx.Services.xxx.xxx.xxxx.xxxx.xxxxRequest
---
System.Data.Entity.Core.EntityException: The underlying provider failed on Open. ---> System.InvalidOperationException: Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.
Run Code Online (Sandbox Code Playgroud)
我看过几篇关于这个连接池错误的帖子。我已经阅读了其中的大部分内容,我明白为什么会发生这种情况,以及应用程序端的可能解决方案,比如关闭应用程序打开的连接。这些是我的理解:
我如何从数据库端监控这一点。我看到了一些建议,例如使用 sp_who 或 sp_who2 查看现有会话。当我看到这些错误时执行 sp_who2 时,我看到很多活动会话,但是我怎么能看到连接池池下的信息和连接。问题:
我注意到当问题发生时,通常运行得更快的查询会变慢。
我知道有一个类似的问题之前,在SO如图所示这里 然而,这个问题的答案真的没有解决我的问题。这是我的场景,我将使用 PowerShell 进行演示。
以下代码将在我的本地 sql2016 实例上创建两个会话
#The only difference in the two connection strings is [pooling] property, the $connstr_1 has pooling=true, while the $connstr_2 has pooling=false.
$connstr_1 = "data source=localhost\sql2016; initial catalog=master; trusted_connection=true; app=ConnPoolTest; pooling=true";
$SqlConnection1 = New-Object System.Data.SqlClient.SqlConnection($connstr_1)
$connstr_2 = "data source=localhost\sql2016; initial catalog=master; trusted_connection=true; app=ConnPoolTest; pooling=false";
$SqlConnection2 = New-Object System.Data.SqlClient.SqlConnection($connstr_2)
$SqlConnection1.Open()
$SqlConnection2.Open();
Run Code Online (Sandbox Code Playgroud)
我的问题是在 sql server 端,我怎么知道哪个会话的连接字符串将池属性设置为true
和哪个设置为false
?
sql-server ×6
mysql ×2
ado.net ×1
amazon-rds ×1
aws ×1
connections ×1
performance ×1
timeout ×1
transaction ×1