C# MVC5 classic ADO.NET 何时打开连接
C# MVC5 classic ADO.NET when to open connection
我将 MVC5 与 classic ADO.NET 对象一起使用,例如 sqldatareader 和 sqldataadapter 以及 sqlconnection 等等....
我的控制器在初始化时创建了一个连接,因为我需要将请求对象发送到 class 保存与问题无关的 sqlconnection 所以我的控制器有一个覆盖 void
protected override void Initialize(RequestContext requestContext)
{
base.Initialize(requestContext);
db = new db(Request);
db.Connect();
}
其中 db 是我的 class 方法 (connect) 将创建 sqlconnection 对象并打开一个连接...
为了关闭连接,我使用控制器的处理方法如下
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
if (db != null)
{
db.Close();
db = null;
}
}
一切正常然后有一次我收到一个奇怪的服务器错误(无法连接到数据库)请注意我的主机是 smarterasp.net
我可以使用家用计算机远程连接到数据库,我也可以连接到 Web 主机,所以问题出在我的 Web 主机和数据库主机之间,或者我的应用程序和数据库主机之间...
或者它可能与连接池有关,即使服务器错误没有给我任何详细信息或堆栈跟踪(母鸡错误不在我的应用程序线程中)....
我已经通过打开 smarterasp.net 控制面板的(远程 iis)选项卡并单击(修复 ACL)解决了这个问题,我不知道它做了什么,但它解决了我的问题。 ...暂时:(不幸的是,此后问题多次出现
所以我的问题是简短的
在我初始化控制器时打开连接并在控制器处理时关闭它是一种好习惯吗???
您认为错误的原因是什么?
最后,如果问题不够清楚,我想道歉,因为英语不是我的母语(很明显)....
非常感谢
so my question is in short format is it good practice to open the
connection while I'm initializing the controller and close it while
the controller disposing???
我认为这不是一个好方法。你不应该打开/关闭数据库连接和/或从你的控制器访问数据库。控制器应尽可能"thin"。此外 - 连接应保持打开的时间尽可能短,让 ADO.NET connection pooling 为您处理细节。
我还建议将您的连接包装在一个 using 块中,因为它会隐式调用 close 方法:
using (SqlConnection connection = new SqlConnection(
connectionString))
{
SqlCommand command = new SqlCommand(queryString, connection);
command.Connection.Open();
command.ExecuteNonQuery();
}
你没有说具体错误是什么。乍一看,在尝试关闭连接之前,您甚至没有检查连接是否打开。在尝试明确关闭它之前,您应该检查 connection state 并且这应该发生在控制器之外。尽管我建议您将 SqlConnection 包装在 using 块中(如上所述)。
编辑
我读了你的评论。您正在尝试在控制器生命周期的上下文中管理连接,我怀疑这是您的问题。
如果您使用 Entity Framework(或者可能是另一个 ORM),一个带有 "per-request lifestyle" 的 IoC - 那么 IoC 容器会在每个请求结束时正确处理您的上下文(连接),并在每个新实例上提供一个新实例。
如果您想以这种方式管理数据库连接,也许您可以探索这个选项。
我将 MVC5 与 classic ADO.NET 对象一起使用,例如 sqldatareader 和 sqldataadapter 以及 sqlconnection 等等.... 我的控制器在初始化时创建了一个连接,因为我需要将请求对象发送到 class 保存与问题无关的 sqlconnection 所以我的控制器有一个覆盖 void
protected override void Initialize(RequestContext requestContext)
{
base.Initialize(requestContext);
db = new db(Request);
db.Connect();
}
其中 db 是我的 class 方法 (connect) 将创建 sqlconnection 对象并打开一个连接...
为了关闭连接,我使用控制器的处理方法如下
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
if (db != null)
{
db.Close();
db = null;
}
}
一切正常然后有一次我收到一个奇怪的服务器错误(无法连接到数据库)请注意我的主机是 smarterasp.net
我可以使用家用计算机远程连接到数据库,我也可以连接到 Web 主机,所以问题出在我的 Web 主机和数据库主机之间,或者我的应用程序和数据库主机之间...
或者它可能与连接池有关,即使服务器错误没有给我任何详细信息或堆栈跟踪(母鸡错误不在我的应用程序线程中)....
我已经通过打开 smarterasp.net 控制面板的(远程 iis)选项卡并单击(修复 ACL)解决了这个问题,我不知道它做了什么,但它解决了我的问题。 ...暂时:(不幸的是,此后问题多次出现
所以我的问题是简短的 在我初始化控制器时打开连接并在控制器处理时关闭它是一种好习惯吗???
您认为错误的原因是什么?
最后,如果问题不够清楚,我想道歉,因为英语不是我的母语(很明显)....
非常感谢
so my question is in short format is it good practice to open the connection while I'm initializing the controller and close it while the controller disposing???
我认为这不是一个好方法。你不应该打开/关闭数据库连接和/或从你的控制器访问数据库。控制器应尽可能"thin"。此外 - 连接应保持打开的时间尽可能短,让 ADO.NET connection pooling 为您处理细节。
我还建议将您的连接包装在一个 using 块中,因为它会隐式调用 close 方法:
using (SqlConnection connection = new SqlConnection(
connectionString))
{
SqlCommand command = new SqlCommand(queryString, connection);
command.Connection.Open();
command.ExecuteNonQuery();
}
你没有说具体错误是什么。乍一看,在尝试关闭连接之前,您甚至没有检查连接是否打开。在尝试明确关闭它之前,您应该检查 connection state 并且这应该发生在控制器之外。尽管我建议您将 SqlConnection 包装在 using 块中(如上所述)。
编辑
我读了你的评论。您正在尝试在控制器生命周期的上下文中管理连接,我怀疑这是您的问题。
如果您使用 Entity Framework(或者可能是另一个 ORM),一个带有 "per-request lifestyle" 的 IoC - 那么 IoC 容器会在每个请求结束时正确处理您的上下文(连接),并在每个新实例上提供一个新实例。
如果您想以这种方式管理数据库连接,也许您可以探索这个选项。