无法从连接字符串配置超时
Cannot configure timeout from connection string
我在 SQL Server 2008 R2 中创建了这个存储过程:
CREATE PROCEDURE dbo.test AS
BEGIN
WAITFOR DEALY '00:00:40'
END
我还编写了一个 C# 控制台应用程序来测试连接超时 属性。
static void Main(string[] args)
{
OpenSqlConnection();
Console.ReadLine();
}
private static void OpenSqlConnection()
{
string connectionString = GetConnectionString();
using (SqlConnection connection = new SqlConnection(connectionString))
{
using (var command = new SqlCommand("dbo.test", connection) { CommandType = CommandType.StoredProcedure })
{
connection.Open();
Console.WriteLine("ConnectionTimeout: {0}", connection.ConnectionTimeout);
command.ExecuteNonQuery();
Console.WriteLine("Finished");
connection.Close();
}
}
}
static private string GetConnectionString()
{
return
"Data Source=test.com;Initial Catalog=test_db;Integrated Security=True;MultipleActiveResultSets=True;Connect Timeout=10; Application Name=Test";
}
有一个连接超时异常作为异常返回(连接字符串超时 < 40 秒)。但是,当我将 Connect Timeout 属性 更改为 120 时,我仍然遇到相同的超时异常。经过反复试验,无论我的连接字符串值如何,超时值似乎始终为 30s。
连接超时是由其他地方控制的吗? (如果是,在哪里?)
为什么连接字符串中的连接超时值对我的控制台应用程序没有影响?
更新
谢谢大家。我刚刚注意到命令超时不同于连接超时(连接字符串中的超时)。
我必须按照 Sudipta Maiti 的建议指定 CommandTimeout
属性 并重新编译我的代码,而不是更改我的 app.config
。
有一个类似的问题:
http://forums.asp.net/t/1197160.aspx?Can+you+change+command+timeout+via+the+connection+string+
使用 CommandTimeout:
using (var command = new SqlCommand("dbo.test", connection) {
CommandType = CommandType.StoredProcedure })
{
connection.Open();
Console.WriteLine("ConnectionTimeout: {0}",
connection.ConnectionTimeout);
command.CommandTimeout = 120;
command.ExecuteNonQuery();
Console.WriteLine("Finished");
connection.Close();
}
我强烈怀疑给定的超时,它可能不足以完成您的操作。所以让它 Connection Timeout=30;
Connect Timeout -or- Connection Timeout
通过 default
值将是 15
秒。根据您的操作性能,您可能需要延长秒数。
当连接返回到连接池时,将其创建时间与当前时间进行比较,如果该时间跨度(以秒为单位)超过 Connection Lifetime 指定的值,则连接被销毁。这在集群配置中很有用,可以强制 运行 服务器和刚刚联机的服务器之间的负载平衡。
零 (0) 值会导致池连接具有最大连接超时。
我在 SQL Server 2008 R2 中创建了这个存储过程:
CREATE PROCEDURE dbo.test AS
BEGIN
WAITFOR DEALY '00:00:40'
END
我还编写了一个 C# 控制台应用程序来测试连接超时 属性。
static void Main(string[] args)
{
OpenSqlConnection();
Console.ReadLine();
}
private static void OpenSqlConnection()
{
string connectionString = GetConnectionString();
using (SqlConnection connection = new SqlConnection(connectionString))
{
using (var command = new SqlCommand("dbo.test", connection) { CommandType = CommandType.StoredProcedure })
{
connection.Open();
Console.WriteLine("ConnectionTimeout: {0}", connection.ConnectionTimeout);
command.ExecuteNonQuery();
Console.WriteLine("Finished");
connection.Close();
}
}
}
static private string GetConnectionString()
{
return
"Data Source=test.com;Initial Catalog=test_db;Integrated Security=True;MultipleActiveResultSets=True;Connect Timeout=10; Application Name=Test";
}
有一个连接超时异常作为异常返回(连接字符串超时 < 40 秒)。但是,当我将 Connect Timeout 属性 更改为 120 时,我仍然遇到相同的超时异常。经过反复试验,无论我的连接字符串值如何,超时值似乎始终为 30s。
连接超时是由其他地方控制的吗? (如果是,在哪里?)
为什么连接字符串中的连接超时值对我的控制台应用程序没有影响?
更新
谢谢大家。我刚刚注意到命令超时不同于连接超时(连接字符串中的超时)。
我必须按照 Sudipta Maiti 的建议指定 CommandTimeout
属性 并重新编译我的代码,而不是更改我的 app.config
。
有一个类似的问题: http://forums.asp.net/t/1197160.aspx?Can+you+change+command+timeout+via+the+connection+string+
使用 CommandTimeout:
using (var command = new SqlCommand("dbo.test", connection) {
CommandType = CommandType.StoredProcedure })
{
connection.Open();
Console.WriteLine("ConnectionTimeout: {0}",
connection.ConnectionTimeout);
command.CommandTimeout = 120;
command.ExecuteNonQuery();
Console.WriteLine("Finished");
connection.Close();
}
我强烈怀疑给定的超时,它可能不足以完成您的操作。所以让它 Connection Timeout=30;
Connect Timeout -or- Connection Timeout
通过 default
值将是 15
秒。根据您的操作性能,您可能需要延长秒数。
当连接返回到连接池时,将其创建时间与当前时间进行比较,如果该时间跨度(以秒为单位)超过 Connection Lifetime 指定的值,则连接被销毁。这在集群配置中很有用,可以强制 运行 服务器和刚刚联机的服务器之间的负载平衡。
零 (0) 值会导致池连接具有最大连接超时。