GVKun编程网logo

asp.net – .net SqlCommandTimeOut和连接池(.net 数据库连接池)

19

对于asp.net–.netSqlCommandTimeOut和连接池感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解.net数据库连接池,并且为您提供关于.NETCore:具有接口实现的设

对于asp.net – .net SqlCommandTimeOut和连接池感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解.net 数据库连接池,并且为您提供关于.NET Core:具有接口实现的设计建议SetCommandTimeout、.net – 为所有新的Command对象设置自定义默认CommandTimeout、ADO.NET 的 Connection Timeout 和 Command Timeout (转载)、ADO.NET中有关SqlConnection与Sqlcommand 的介绍与应用的宝贵知识。

本文目录一览:

asp.net – .net SqlCommandTimeOut和连接池(.net 数据库连接池)

asp.net – .net SqlCommandTimeOut和连接池(.net 数据库连接池)

假设我们正在执行许多不同的sql命令,并且sqlCommand.CommandTimeout以默认值30秒离开.

让我们假设一些sql命令只是长查询,我们可能会得到超时异常.

纠正我,如果我错了,这个例外只是因为.Net不想再等了,但如果我们使用连接池,这个连接可能会保持打开状态,那么sql语句可能仍然在sql服务器端运行?或者这些系统之间存在一些隐藏的通信,无论我们是否使用连接池,都会突然停止它?

只是想知道什么是机制,它会影响sql服务器的性能.我的意思是如果查询真的很长,如果它仍在运行需要10分钟才能运行它可能只会减慢服务器的速度,因为没有人能够得到结果.

UPDATE

所以这里我特别询问连接池,它肯定是代码将关闭与异常处理的连接,或者我们可以假设使用的代码是@dash在这里命名的首选模式.问题是如果我在该sqlConnection对象上调用Close()或dispose()方法,它将返回到连接池,它不会在物理上关闭它.

我问它什么时候返回池,那个长查询仍然在sql Server端运行.如果可能的话,如何避免这种情况.

再次更新

感谢@dash提到有关数据库事务的问题,是的,回滚将使它等待,我们没有关闭连接并将其返回到池中.那么,如果只是一个长期的选择查询或更新但只是一个单独的更新而不涉及任何数据库事务呢?特别是我想知道有没有一种方法可以告诉sql Server我现在不需要结果请停止运行它?

解决方法

这完全取决于你如何执行你的查询;

想象一下以下查询:

sqlConnection myConnection = new sqlConnection("connection_string");

sqlCommand myCommand = new sqlCommand();
myCommand.Connection = myConnection;
myCommand.CommandType = CommandType.StoredProcedure;
myCommand.CommandTimeout = some_long_time;
myCommand.CommandText = "database_killing_procedure_lol";

myConnection.open() //Connection's Now open

myCommand.ExecuteNonQuery();

会发生两件事;一个是这个方法将排队,直到command.ExecuteNonQuery()完成.第二个是我们还将在方法持续时间内连接来自连接池的连接.

如果我们超时会发生什么?好吧,抛出一个异常 – 一个带有Number属性= -2的sqlException.但是,请记住,在上面的代码中,没有异常管理,所以所有会发生的事情是对象将超出范围,我们需要等待它们被处置.特别是,在这种情况发生之前,我们的连接不可重复使用.

这是以下模式首选的原因之一:

using(sqlConnection myConnection = new sqlConnection("connection_string"))
{
    using(sqlCommand myCommand = new sqlCommand())
    {

        sqlCommand myCommand = new sqlCommand();
        myCommand.Connection = myConnection;
        myCommand.CommandType = CommandType.StoredProcedure;
        myCommand.CommandTimeout = some_long_time;
        myCommand.CommandText = "database_killing_procedure_lol";

        myConnection.open() //Connection's Now open

        myCommand.ExecuteNonQuery();    

    }

}

这意味着,一旦查询完成,自然(它运行完成)或通过异常(超时或其他),资源立即返回.

在您的特定问题中,由于许多原因,需要花费很长时间才能执行大量查询.在Web应用程序中,您可能有许多用户争用有限数量的资源;内存,数据库连接,cpu时间等.因此,将这些操作与昂贵的操作捆绑在一起会降低Web应用程序的响应能力和性能,或者限制可以同时提供服务的用户数量.此外,如果数据库操作很昂贵,您也可以绑定数据库,进一步限制了性能.

由于这个原因,总是值得尝试将数据库查询的执行时间降低.如果你不能,那么你必须要小心你可以同时运行多少种类型的查询.

编辑:

所以你真的对sql Server端发生的事情感兴趣…答案是……这取决于它! CommandTimeout实际上是一个客户端事件 – 你所说的是如果查询花费的时间超过n秒,那么我不想再等了. sql Server被告知是这种情况,但它仍然必须处理它当前正在做的事情,因此它实际上可能需要一些时间才能完成sql Server查询.它将尝试优先考虑这一点,但这就是它.

交易尤其如此;如果您正在运行包含在事务中的查询,并将其作为异常管理的一部分回滚,那么您必须等到回滚完成.

看到人们发生恐慌并开始针对运行查询的sql进程ID发出KILL命令也很常见.如果命令正在运行事务,这通常是一个错误,但对于长时间运行的选择通常是可以的.

sql Server必须管理它的状态,以使其保持一致.客户端不再监听这一事实意味着您已经浪费了工作,但sql Server仍然需要自行清理.

所以,ASP.Net方面的一切都很好,因为它不关心,但sql Server仍然必须完成它开始的工作,或达到可以安全地放弃工作,或回滚任何变化的点任何已打开的交易.

这显然会对数据库服务器产生性能影响,具体取决于查询!

即使是在事务之外长时间运行的SELECT或UPDATE或INSERT也必须完成. sql Server会尽快尝试放弃它,但前提是这样做是安全的.显然,对于UPDATES和INSERT尤其如此,它必须达到数据库仍然一致的程度.对于SELECT,它会尽快结束.

.NET Core:具有接口实现的设计建议SetCommandTimeout

.NET Core:具有接口实现的设计建议SetCommandTimeout

如何解决.NET Core:具有接口实现的设计建议SetCommandTimeout?

我们有一个设置

public class SomeController : Controller
{
    private readonly SomeContextClass _context;
     
    public SomeController(SomeContextClass context)
    {
        _context = context;
    }   
}    
//Context Class
public SomeContextClass : DbContext
{
    public SomeContextClass(DbContextOptions<SomeContextClass> op) : base(op){

        Database.SetCommandTimeout(9000);
    }
}

我们正在考虑将其更新为最小影响

public class SomeController : Controller
{
    private readonly ISomeContextClass _context;
     
    public SomeController(ISomeContextClass context)
    {
        _context = context;
    }


}

//Context Class
public SomeContextClass : DbContext,ISomeContextClass
{
    public SomeContextClass(DbContextOptions<SomeContextClass> op) : base(op){

        Database.SetCommandTimeout(9000);
    }
}
当上下文要初始化时,带有接口的

,是否仍将设置命令超时?我猜想它将利用无参数构造函数。

如果是,那么如何使用无参数构造函数设置命令超时?没有明确地这样做,因为我们的单元测试开始导致数据库外观失败

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

.net – 为所有新的Command对象设置自定义默认CommandTimeout

.net – 为所有新的Command对象设置自定义默认CommandTimeout

默认值为 CommandTimeout的值为30秒.您可以通过执行以下操作手动更改命令对象实例上的值
Dim cmd As New System.Data.sqlClient.sqlCommand
cmd.CommandTimeout = 60

有没有办法指定一个不同的默认值,这样所有新的命令对象在创建时都会自动在你的解决方案中有这个值?

据我所知,没有办法改变这个默认值. sqlCommand的构造函数代码是:
public sqlCommand()
{
    this.ObjectID = Interlocked.Increment(ref _objectTypeCount);
    this._commandTimeout = 30;
    this._updatedRowSource = UpdateRowSource.Both;
    this._prepareHandle = -1;
    this._rowsAffected = -1;
    this._notificationAutoEnlist = true;
    GC.SuppressFinalize(this);
}

一个可能的解决方法是使用预定义的sqlCommand作为参数传递给构造函数,该构造函数以sqlCommand为参数.

所以你可以创建一个全局的sqlCommand(一个模板)

Dim commandTemplate60 = new sqlCommand()
 commandTemplate60.Timeout = 60

然后当您需要超时时间为60秒的命令时

Dim cmd As New System.Data.sqlClient.sqlCommand(commandTemplate60)

但是,直接设置超时,似乎不是很大的工作

ADO.NET 的 Connection Timeout 和 Command Timeout (转载)

ADO.NET 的 Connection Timeout 和 Command Timeout (转载)

每次对数据库连接时,我们有时候会碰到连接超时或者命令超时,这两个超时是不一样的。以 ADO.NET 为例,当客户端和服务器端连接时,碰到的超时情况主要有下面几种:
当从连接池获取一个连接时,碰到超时。
当建立一个全新连接(而不是从连接池获取)时,碰到超时。
当发送一个命令(command)到 SQL Server 时,超时。
当发送命令(连接字符串带有 “context connection=true” 属性)到 SQL Server 时,超时。
当不是显示的发送一个命令(implicitly)到 SQL Server 时,碰到超时。
当执行异步命令时,(BeginExecute)碰到超时。
当从服务器端,获取行时,碰到超时。
当用 Bulk copy 方式,上传数据时,碰到超时。
这些超时主要是通过连接字符串中的 Connect Timeout 和 SqlCommand.CommandTimeout 来进行控制。前面两种是登录超时由 Connection Timeout 来决定什么时候超时,后面几种是命令超时由 Command Timeout 来决定什么时候超时。

 

SqlConnection.ConnectionTimeout :
1. 说明: 获取在尝试建立连接时终止尝试并生成错误之前所等待的时间。
2. 默认值:等待连接打开的时间(以秒为单位)。默认值为 15 秒。
3. 备注:值 0 指示无限制
4. 只读

注意 ConnectionTimeout 可以在数据库连接字符串上直接进行设置,如下所示:

Server=(localdb)\mssqllocaldb;Database=yourDb;Trusted_connection=true;Connect Timeout=100;

这也是目前使用 EF Core 时,设置 ConnectionTimeout 比较好的一种方式

 

SqlCommand.CommandTimeout :
1. 说明:获取或设置在终止执行命令的尝试并生成错误之前的等待时间。
2. 默认值:等待命令执行的时间(以秒为单位)。默认为 30 秒。
3. 备注:值 0 指示无限制,在 CommandTimeout 中应避免值 0,否则会无限期地等待执行命令。
4. 可读可写

在 EF Core 中可以通过 DbContext 来调用 SetCommandTimeout 和 GetCommandTimeout 方法,来设置和获取 CommandTimeout 的值,如下所示:

DbContext dbContext = ...//创建DbContext对象

dbContext.Database.SetCommandTimeout(100);
int? commandTimeout = dbContext.Database.GetCommandTimeout();

 

特别注意:
"超时时间已到。在操作完成之前超时时间已过或服务器未响应"
类似这种错误,一般是 SqlCommand.CommandTimeout  或者 SqlBulkCopy.BulkCopyTimeout 的时间超时, 而不是 SqlConnection.ConnectionTimeout。

 

 

原文链接

 

ADO.NET中有关SqlConnection与Sqlcommand 的介绍与应用

ADO.NET中有关SqlConnection与Sqlcommand 的介绍与应用

ADO.NET中有关SqlConnection与Sqlcommand 的介绍与应用

思维导图:

 

ADO.NET提供5个主要的类的对象来实现数据的连接访问和离线访问。这5个类分别是Connection、Command、DataReader、DataAdapter和DataSet。

SqlConnection 的介绍与应用

1、介绍与作用

SqlConnection是ADO.NET中的连接类。

 使用sqlconnection 类可以连接到SQL  Server数据库。

2、主要属性以及方法

   主要属性:ConnectionString(连接字符串)

   其它属性简介:

属性

说明

ClientConnectionId

最近连接尝试连接的 ID,无论该尝试是成功还是失败。

ConnectionTimeout

获取在尝试建立连接时终止尝试并生成错误之前所等待的时间。 (重写 DbConnectionConnectionTimeout。)

Container

获取 IContainer,它包含 Component。 (继承自 Component。)

Credential

获取或设置此连接的 SqlCredential 对象。

Database

获取当前数据库或连接打开后要使用的数据库的名称。 (重写 DbConnectionDatabase。)

DataSource

获取要连接的 SQL Server 实例的名称。 (重写 DbConnectionDataSource。)

FireInfoMessageEventOnUserErrors

获取或设置 FireInfoMessageEventOnUserErrors 属性。

PacketSize

用来与 SQL Server 的实例进行通信的网络数据包的大小,以字节为单位。

ServerVersion

获取包含客户端连接的 SQL Server 实例的版本的字符串。 (重写 DbConnectionServerVersion。)

Site

获取或设置 Component 的 ISite。 (继承自 Component。)

State

指示最近在连接上执行网络操作时, SqlConnection 的状态。 (重写 DbConnectionState。)

StatisticsEnabled

如果设置为 true,则对当前连接启用统计信息收集。

WorkstationId

获取标识数据库客户端的一个字符串。

方法:Open();(打开数据库)  Close();(关闭数据库)

构造函数:

名称

说明

SqlConnection

初始化 SqlConnection 类的新实例。

SqlConnection(String)

如果给定包含连接字符串的字符串,则初始化 SqlConnection 类的新实例。

SqlConnection(String, SqlCredential)

初始化给定连接字符串的 SqlConnection 类的新实例,而不使用包含用户识别号和密码的 Integrated Security = true 和 SqlCredential 对象。

 

3、创建SqlConnection对象:

  可以使用定义好的连接字符串创建SqlConnection对象。代码如下

  SqlConnection  connection=new  SqlConnection(connectionString);

要访问数据源,必须先建立连接。这个连接对象里描述了数据库服务器类型、数据库的名字、用户名、密码等参数。

 SqlConnection  conn=new  SqlConnection();

conn.ConnectionString=”Data Source=(Local);

Initial  Catalog=pubs;  uid=sa;  pwd=sa;”

调用SqlConnection 对象的Open()与Close() 方法来打开和关闭数据库的代码如下:

打开数据库:connection.Open();

关闭数据库:connection.Close();

 

SqlCommand的介绍与应用

  SqlCommand属于命令类

1、作用:

 SqlCommand 对象用于执行具体的SQL语句,如增加、删除、修改、查找。

2、主要属性以及方法

SqlCommand对象的常用属性

属  性

说  明

Connection属性

指定Command对象所使用的Connection对象。

CommandType属性

指定Command对象的类型,有3种选择:

1 Text:表示Command对象用于执行SQL语句。

2 StoredProcedure:表示Command对象用于执行存储过程。

3 TableDirect:表示Command对象用于直接处理某个表。

CommandType属性的默认值为Text

CommandText属性

根据CommandType属性的取值来决定CommandText属性的取值,分为3种情况:

1 如果CommandType属性取值为Text,则CommandText属性指出SQL语句的内容

2 如果CommandType属性取值为StoredProcedure,则CommandText属性指出存储过程的名称

3 如果CommandType属性取值为TableDirect,则CommandText属性指出表的名称

CommandText属性的默认值为SQL语句

CommandTimeout属性

指定Command对象用于执行命令的最长延迟时间,以秒为单位,如果在指定时间内仍不能开始执行命令,则返回失败信息。

默认值为30秒。

Parameters属性

指定一个参数集合。

SqlCommand对象的重要方法:

方法

说明

ExecuteScalar

执行查询,并返回查询结果中的第一行第一列的值,类型是object

ExecuteNonQuery

执行SQL语句并返回受影响的行数

ExecuteReader

执行查询命令,返回SqlDataReader对象

 

3、SqlCommand对象的使用步骤如下

(1)创建SqlConnection对象

 SqlConnection  connection=new  SqlConnection(connectionString);

(2)定义SQL语句

 把所要执行的SQL语句赋给字符串。

(3)创建SqlCommand对象

  SqlCommand command = new SqlCommand();

(4)调用SqlCommand对象的某个方法,执行SQL语句。

 注意在调用SqlCommand 对象的某个方法之前,一定要打开数据库连接,否则程序会出错

举例如下:

public partial class Form1 : Form

    {

        //数据库连接字符串       

        private static string connString = "Data Source=localhost;Initial Catalog=QQ;Integrated Security=true";

        //数据库连接对象

        public static SqlConnection connection = new SqlConnection(connString);

        public Form1()

        {

            InitializeComponent();

        }

        //执行SQL语句

        private void btnSql_Click(object sender, EventArgs e)

        {

            try

            {

                //查询用的 SQL 语句

                string selectSql = "select count(*) from Users";

                //创建Command对象

                SqlCommand command = new SqlCommand();

                //指定Command对象所使用的Connection对象

                command.Connection = connection;

                //指定Command对象用于执行SQL语句

                command.CommandType = CommandType.Text;

                //指定要执行的SQL语句

                command.CommandText = selectSql;        

                //打开数据库连接

                connection.Open();

                //执行查询操作,返回单个值

                this.txtCount.Text = command.ExecuteScalar().ToString();

            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.Message);

            }

            finally

            {

                //关闭数据库连接

                connection.Close();

            }

        }

        //执行存储过程

        private void btnStoreProc_Click(object sender, EventArgs e)

        {

            try

            {

                //创建Command对象

                SqlCommand command = new SqlCommand();

                //指定Command对象所使用的Connection对象

                command.Connection = connection;

                //指定Command对象用于执行存储过程

                command.CommandType = CommandType.StoredProcedure;

                //指定要执行的存储过程的名称

                command.CommandText = "procSelect1";               

                //打开数据库连接

                connection.Open();

                //执行查询操作,返回单个值

                this.txtCount.Text = command.ExecuteScalar().ToString();

            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.Message);

            }

            finally

            {

                //关闭数据库连接

                connection.Close();

            }

        }

}

 

关于asp.net – .net SqlCommandTimeOut和连接池.net 数据库连接池的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于.NET Core:具有接口实现的设计建议SetCommandTimeout、.net – 为所有新的Command对象设置自定义默认CommandTimeout、ADO.NET 的 Connection Timeout 和 Command Timeout (转载)、ADO.NET中有关SqlConnection与Sqlcommand 的介绍与应用的相关知识,请在本站寻找。

本文标签: