Я использую Advantage Database Server v10 и соответствующий поставщик ADO.NET. Я обнаружил, что AdsConnection.Close
занимает значительное количество времени после выполнения INSERT/UPDATE
запросов.Advantage Database Server INSERT/UPDATE вызывает проблемы с производительностью
Например этот образец
class Program
{
static void Main(string[] args)
{
var openTimer = new Stopwatch();
var closeTimer = new Stopwatch();
var executeTimer = new Stopwatch();
for (int ix = 0; ix < 100; ix++)
{
openTimer.Start();
using (var cnn = new AdsConnection(
@"data source=...; ServerType=remote; user id=admin; password=..."))
{
cnn.Open();
openTimer.Stop();
executeTimer.Start();
using (var cmd = cnn.CreateCommand())
{
cmd.CommandText = "SELECT MAX(colUGId) FROM tblUserGroup";
var id = (int)cmd.ExecuteScalar() + 1;
cmd.CommandText = "INSERT INTO tblUserGroup (colUGId, colName, colDesc) VALUES (:id, :name, :desc)";
cmd.Parameters.Add("id", id);
cmd.Parameters.Add("name", "Name " + id);
cmd.Parameters.Add("desc", "Description " + id);
cmd.ExecuteNonQuery();
}
executeTimer.Stop();
closeTimer.Start();
}
closeTimer.Stop();
}
Console.WriteLine("Open: {0}; Execute: {1}; Close: {2}", openTimer.Elapsed, executeTimer.Elapsed, closeTimer.Elapsed);
}
}
выходы:
Open: 00:00:00.2361612; Execute: 00:00:15.3849932; Close: 00:00:05.4333431
Это очень интересно, почему 100 операций вставки в простую таблицу с тривиальными индексами и без каких-либо триггеров занимает 15 секунд. Но самый важный вопрос: почему Close
занимает так много времени?
Любые идеи?
UPDATE
Только что попробовал то же самое с SQL Server. Он работает на другой рабочей станции, что немного быстрее, чем рабочая станция с Advantage. В любом случае, я вижу, что пул соединений работает (в случае SQL Server) хорошо:
Open: 00:00:00.2279668; Execute: 00:00:00.0189551; Close: 00:00:00.0003487
Вы создаете и удаляете класс AdsConnection 100 раз. Почему бы не просто открыть его один раз, выполнить все свои вставки, а затем закрыть? –
@BradM Я думал, что пул соединений был изобретен, чтобы спасти меня от этого –
т.е. правильно, объединение пулов должно решить именно это, см. также: http://devzone.advantagedatabase.com/dz/webhelp/Advantage11.1/dotnet_advantage_net_data_provider_and_connection_pooling.htm –