この質問を投稿する前に、私はこのサイトでいくつかの回答を読みました:これとこれのように。「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();
}
どうやら、プールからの接続の取得には、実際の作業(2番目のベンチマークの00:00:00.1110324)の4倍の時間がかかります(00:00:00.5576016-00:00:00.1110324 appr 0.44)。私は何が欠けていますか?
編集:RAMディスク上に作成されたデータベースに対してこれらのベンチマークを実行しているため、すべてのデータベース操作が非常に高速です。