数据库连接-在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);
}
尽管循环确实有效,并且是等待一些后台操作的有效策略,但其他答案似乎错过了一个关键点;你必须让后台操作做一些工作。切换一段时间的循环并不是很有效,但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
{
}
}