Прежде чем отправлять этот вопрос, я прочитал несколько ответов на этом сайте: этого . Все, похоже, согласны с тем, что «пулы приложений C# оптимизированы для нескольких вызовов в одну и ту же базу данных».
Тем не менее, я по-прежнему наблюдаю существенное снижение производительности, если получаю соединение из пула. Вот мои ориентиры:
private const string localConnString = "Data Source=(local);Integrated Security=SSPI;database=MyTest;Pooling=true";
[Test]
public void GetNewConnectionEveryTime()
{
var stopwatch = new Stopwatch();
stopwatch.Start();
for (var i = 0; i < 1000; i++)
{
using (var conn = new SqlConnection(localConnString))
{
conn.Open();
const string saveTrancount = "EXEC dbo.TestTran";
ExecuteSql(conn, saveTrancount);
}
}
stopwatch.Stop();
Console.WriteLine("Time elapsed: {0}", stopwatch.Elapsed);
//Time elapsed: 00:00:00.5576016
}
[Test]
public void ReuseOneConnection()
{
var stopwatch = new Stopwatch();
stopwatch.Start();
using (var conn = new SqlConnection(localConnString))
{
conn.Open();
for (var i = 0; i < 1000; i++)
{
const string saveTrancount = "EXEC dbo.TestTran";
ExecuteSql(conn, saveTrancount);
}
}
stopwatch.Stop();
Console.WriteLine("Time elapsed: {0}", stopwatch.Elapsed);
//Time elapsed: 00:00:00.1110324
}
private void ExecuteSql(SqlConnection conn, string sql, int timeout = 0)
{
var command = conn.CreateCommand();
command.CommandText = sql;
command.CommandType = CommandType.Text;
command.CommandTimeout = timeout;
command.ExecuteNonQuery();
}
Очевидно, что получение соединения из пула занимает в четыре раза больше времени (00: 00: 00.5576016 - 00: 00: 00.1110324 appr 0.44), чем выполнение фактической работы (00: 00: 00.1110324 во втором эталоном). Что мне не хватает?
Изменить: Я запускаю эти тесты против базы данных, созданной на RAM Disk, поэтому все мои операции с базой данных выполняются очень быстро.