数据库连接-在C#中连接之前什么都不做的最佳方式

本文关键字:方式 最佳 什么 连接 数据库连接 | 更新日期: 2023-09-27 17:58:59

我正在研究的一个应用程序中查看连接到DB的代码,我看到了这个

 if (_dbConnection == null)
     _dbConnection = GetConnection();
 while (_dbConnection.State == ConnectionState.Connecting)
 {
     //Do Nothing until things are connected.
 }
 if (_dbConnection.State != ConnectionState.Open)
     _dbConnection.Open();
 var command = GetCommand(commandType);
 command.Connection = _dbConnection;
 return command;

while循环让我担心。在事情连接起来之前,有更好的方法什么都不做吗?

编辑:

连接如下

private static IDbConnection GetConnection()
{
     return new SqlConnection(ConfigurationManager.ConnectionStrings["CoonectionStringName"].ConnectionString);
}

数据库连接-在C#中连接之前什么都不做的最佳方式

尽管循环确实有效,并且是等待一些后台操作的有效策略,但其他答案似乎错过了一个关键点;你必须让后台操作做一些工作。切换一段时间的循环并不是很有效,但Windows会认为应用程序的主线程(可能是进行等待的线程)非常重要,并且在后台操作获得一个CPU时间时钟之前,它会在循环中旋转数百或数千次。

要避免这种情况,请使用线程。Yield()语句,告诉处理器在等待CPU时间的所有其他线程中旋转,并在完成后返回。这允许计算机在等待后台进程时完成一些工作,而不是独占CPU在基本上为空的循环中旋转。这真的很简单;这是贾斯汀修改后的答案:

var startTime = DateTime.Now;
var endTime = DateTime.Now.AddSeconds(5);
var timeOut = false;
while (_dbConnection.State == ConnectionState.Connecting)
{
    if (DateTime.Now.CompareTo(endTime) >= 0)
    {
        timeOut = true;
        break;
    }
    Thread.Yield(); //tells the kernel to give other threads some time
}
if (timeOut)
{
    Console.WriteLine("Connection Timeout");
    // TODO: Handle your time out here.
}

EDIT:请注意,这适用于DbConnection,而不是IDbConnection

您可以始终使用DbConnection类的StateChange事件,而不是while循环。

检查此

考虑到这是一个web应用程序,最好的方法是计算自开始尝试连接以来所经过的时间,如果超过超时时间,则进行转义。显然,抛出一个异常或处理此时的情况。

var startTime = DateTime.Now;
var endTime = DateTime.Now.AddSeconds(5);
var timeOut = false;
while (_dbConnection.State == ConnectionState.Connecting)
{
    if (DateTime.Now.Compare(endTime) >= 0
    {
        timeOut = true;
        break;
    }
}
if (timeOut)
{
    // TODO: Handle your time out here.
}

在StateChange事件上挂起一个处理程序。当国家开放时,做需要做的事。

            m_SqlConnection = new SqlConnection(ConnectionStringBuilder.ConnectionString);
            m_SqlConnection.StateChange += new System.Data.StateChangeEventHandler(m_SqlConnection_StateChange);
            m_SqlConnection.Open();

    void m_SqlConnection_StateChange(object sender, System.Data.StateChangeEventArgs e)
    {
        try
        {
            if (m_SqlConnection.State == ConnectionState.Open)
            {
                //do stuff
            }
            if (m_SqlConnection.State == ConnectionState.Broken)
            {
                Close();
            }
            if (m_SqlConnection.State == ConnectionState.Closed)
            {
                Open();
            }
        }
        catch
        {
        }
    }