1. 什么是SQL Server的无连接
在SQL Server中,无连接(或称为“状态断开”)是指断开一个连接,以使操作系统上的应用程序无法对它进行访问。 在SQL Server中,客户机连接的无连接状态可以通过以下方式发生:
1.1 客户机断电或关闭
如果客户端关闭或断电,则服务器会在指定的timeout时间后将无响应连接关闭。这可以通过在SQL Server Management Studio (SSMS)中使用 Server Properties 对话框中的“Remote query timeout”选项或通过在 Transact-SQL (T-SQL) 中使用 sp_configure 存储过程来配置。 您可以设置这个选项的值,以最大化响应时间,以适应您的应用程序的需求:
EXEC sp_configure 'remote query timeout', 0
RECONFIGURE
1.2 客户端空闲时间过长
如果客户端在一段时间内没有使用服务器连接,则服务器将关闭未响应的连接。这个时间可以在 SQL Server Management Studio (SSMS) 中使用 Server Properties 对话框中的“Remote query timeout”选项中进行设置。
1.3 服务器空闲时间过长
如果服务器在一段时间内没有处理任何操作,则服务器将关闭未响应的连接。这个时间可以在 SQL Server Management Studio (SSMS) 中使用 Server Properties 对话框中的“Remote query timeout”选项中进行设置。
2. 无连接的痛苦
无连接的痛苦主要是由于连接中止导致的应用程序崩溃和连接池过载。
2.1 应用程序崩溃
当应用程序发现它的数据库连接已经不可用时,它无法处理这种情况,往往会崩溃并无法恢复。这可能会导致数据丢失或错误。
2.2 连接池过载
应用程序通常使用连接池来提高性能。 连接池是一个管理多个数据库连接的技术。 当连接池中的一个连接被中止时,连接池会尝试创建一个新连接来取代已经中止的连接。 如果发生这种情况的频率很高,这将导致连接池过载,从而影响应用程序的性能。
3. 如何避免无连接的痛苦
3.1 使用可重试的连接字符串
在应用程序连接到SQL Server时,使用可重试的连接字符串可以避免在数据库连接正常中断时导致的应用程序崩溃。 下面是一个示例连接字符串:
Data Source=myServerAddress;Failover Partner=myMirrorServerAddress;Initial Catalog=myDataBase;Integrated Security=True;
如果主服务器连接中断,连接将自动重定向到镜像服务器。
3.2 设置较短的超时时间
在应用程序连接到SQL Server时,确保设置较短的超时时间以避免应用程序无法处理超时并崩溃。下面是一个设置远程查询超时时间的示例:
EXEC sp_configure 'remote query timeout', 30
RECONFIGURE
3.3 使用连接池大小控制来避免连接池过载
应用程序通常使用连接池技术来提高性能。 在连接池配置中,可以设置连接池大小,使其在初始连接和最大连接数之间动态增长。
<connectionStrings>
<add name="MyConnectionString" connectionString="Data Source=myServerAddress;Initial Catalog=myDataBase;Integrated Security=True; <strong>Max Pool Size=100;Min Pool Size=0</strong>" providerName="System.Data.SqlClient" />
</connectionStrings>
上面示例中设置了最大池大小为100,最小池大小为0。在连接池中最大和最小池大小之间动态增长。
3.4 打开连接后快速执行操作
在打开连接时使用 SqlCommand.ConnectionOpen() 方法将连接对象的打开延迟到最后执行,以获得最佳性能。 在打开连接后,应尽快执行操作,并尽快关闭连接,以便可以将连接返回到连接池中。
SqlConnection conn = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand("SELECT * FROM MyTable", conn);
conn.Open();
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
Console.WriteLine(reader["ColumnName"]);
}
reader.Close();
conn.Close();
4. 总结
无连接在SQL Server中是一种常见的情况,它能导致应用程序崩溃和连接池过载。 为了避免无连接的痛苦,应采取措施,例如使用可重试的连接字符串,设置较短的超时时间,使用连接池控制池大小并快速执行操作。