我正在重构一个.NET AWS Lambda项目,其中包含用于连接到AWS Aurora的MySql.Data.我实现了DI流程,将MySqlConnection作为暂态注册到DI容器中,并将其注入到DataAccess服务中.

MySqlConnection和DataAccess的注册过程如下所示:

启动:

services.AddTransient<MySqlConnection>(provider => 
{
    //Get the necessary parameters and build a connection string.

    return new MySqlConnection(connectionString);
});

services.AddSingleton<IDataAccess, DataAccess>();

数据访问:

private readonly MySqlConnection _connection;

// inject the MySqlConnection.

async function() 
{
  await _connection.OpenAsync();
  await _connection.DoStuff();
  await _connection.CloseAsync();
}

我的老板担心所有的数据库交互都将通过注入到DataAccess类中的单个连接,她不希望数据库崩溃,因为我没有正确清理连接.

我有几个问题:

  1. 我看到旧的代码库在创建新的MySqlConnection时有Using语句,但在MySQL文档中没有看到.当我创建新的MySqlConnection时,我是否需要"Using"语句?
  2. 我应该将MySqlConnection注册为暂态并使用DI,还是只是在使用它的类中创建一个新的MySqlConnection实例?
  3. 数据库连接的DI是否会留下大量打开的连接?或者,在另一个极端,单个连接将减慢lambda的速度,因为它过go 建立了许多连接?

谢谢!

推荐答案

而不是使用DI,您可以使用using条语句.SQL连接将从.NET在应用程序级别维护的池中挑选,并将在连接关闭后返回.有关更多详细信息,请参阅此answer.

然而,连接池在AWS Lambda的情况下不会有太大帮助,因为整个Lambda计算机在空闲超时后被销毁.因此,建议使用RDS proxy,以避免连接相关问题.

使用RDS代理,您可以处理数据库流量中不可预测的激增.否则,这些激增可能会由于超额订阅连接或快速创建新连接而导致问题.RDS代理建立一个数据库连接池,并重复使用该池中的连接.这种方法避免了每次打开新数据库连接时的内存和CPU开销.要防止数据库超额订阅,您可以控制创建的数据库连接的数量.

此外,您还可以 checkout RDS Proxy for SQL Server with AWS Lambda and .NET 6

Mysql相关问答推荐

配置MySQL服务器以管理数千个表

MySQL嵌套的内连接使查询变得很慢-解决方案?

MySQL滑动窗口动态间隔?

MySQL 计数出现的百分比大于

多列分组并进行求和

避免多个SQL查询的重构代码

我在连接到 mysql 的 node js 中收到错误消息发送到客户端后无法设置标头

有没有更好的方法在无限滚动的网页上呈现获取的提要数据?

MySQL UPDATE 锁会因为连续的 SHARE 锁而饿死吗?

Mysql 相等性反对 false 或 true

MySQL:使用来自查询的信息创建一个新表

如何在 Laravel 5.1 中获取数据库中的表列表

让 MySQL 在 OSX 10.7 Lion 上运行

如何从 MySQL Workbench 中的图表生成 SQL 脚本?

如何在 python 中逐行获取 MySQL ResultSet

mysql 数据类型仅存储月份和年份

如何在 MySQL 中删除此索引?

MySQL查询/子句执行顺序

为什么 MySQL 自动增量会在插入失败时增加?

在 MySQL 中存储 IPv6 地址