【发布时间】:2020-04-13 02:12:49
【问题描述】:
我开发了一个简单的应用程序,允许用户在本地数据库中输入数据,但最终它会在生产环境中同时进行许多连接,其中包括存储在数据中心中的数据。
现在我的应用程序可以读取(从两个不同的表)和写入其中一个,但它至少有一个问题:我在用户结束提交数据后立即关闭连接一名员工,我实际上希望应用程序允许在一个会话中为他们中的许多人输入,所以流程是:
(1) 。用户进入应用程序 > (2) 。用户保存员工 > (3) 。这 应用程序通知用户输入的结果(可能是 多个字段的重复值会显示错误,a 成功保存员工消息等)[这里我关闭连接]>(4)。返回到 (2),如果用户选择这样做,我尝试再次打开它。
编辑: 关闭连接后立即尝试输入新用户时出现的错误是
"connection must be valid and open"
我希望 Singleton 对象可以处理这个问题,但实际上并没有这样做。
private MySQLDataAccess()
{
this.openConnection();
}
private MySqlConnection Connection;
private static MySQLDataAccess instance;
public static MySQLDataAccess GetInstance()
{
if(instance == null)
{
instance = new MySQLDataAccess();
}
return instance;
}
所以,我的问题是……
应用程序是否应该在应用程序结束后立即关闭与数据库的连接?这可能包括一位用户一次性节省了 50 多名员工。
或者我应该在每次保存用户时关闭连接,然后再次打开它以保存新用户? (这是我现在正在尝试做的,但我做得不好)
【问题讨论】:
-
如果您在 IIS 中部署它,它将使用连接池,因此您的应用程序不会直接打开和关闭连接。所以我只会使用
using语句来创建和处理你需要的 MySqlConnection 对象。实际的打开和关闭将由连接池处理。 (注意,“应用程序是否应在应用程序结束后立即关闭与数据库的连接”在 Web 环境中没有多大意义。每次触发 HTTP 请求时都会单独建立连接。) -
“这种方法”是指我建议的方法吗?是的。 ADO.NET 有连接池并且 MySQL 连接器支持它。我建议您阅读以下内容:dev.mysql.com/doc/connector-net/en/…
-
@newbie “最佳”方式是所有教程和课程中显示的方式 - 只需在
using块内创建连接,当执行离开块时,连接将被关闭并释放。 不要使用单例连接,这只会由于锁积累和与其他连接的阻塞而导致性能下降 -
@newbie 否。只要您想访问数据库,就创建 MySqlConnection 的新实例。通常这是在数据访问层 (DAL) 或类似 ORM 的实体框架中完成的。
-
@newbie “不应该只有单个对象的一个实例处理数据库连接”......不,不应该。这是不必要的。再次阅读连接池的工作原理。您的代码并不真正负责打开和关闭连接。当您在代码中“打开”一个连接时,它实际上只是从池中获取一个连接,该连接很可能已经打开。
标签: c# mysql asp.net-mvc