Триал IBProvider v3.31.0 [Сборка 21347]
Привет всем.
Несколько месяцев назад решил поглумиться над клиентом Firebird (v2.5) — заставить его тупить минут 10 над коммитом. Сценарий простой — перед коммитом нужно выполнить 100500 раз execute-close для селективного запроса.
И ничего не получилось. Это меня расстроило и я полез смотреть — какого? Обнаруженное меня тоже расстроило.
Оказывается у IBProvider-a постоянно запрашивается значение свойства «Connection Status». А провайдер честно определял состояние подключения через вызов isc_database_info. Вызов последней функции и «спасал» серверного клиента, очищая очередь отложенных пакетов над которой и должен был тупить коммит.
Позднее, на других экспериментах, было обнаружено что это постоянное чтение «Connection Status» мягко выражаясь, грубо говоря снижает производительность провайдера.
Вообщем, после нескольких месяцев размышлений, я решил упростить проверку состояния подключения. Теперь (по умолчанию) провайдер смотрит на свое текущее состояние и на результат завершения последней операции. К серверу не лезет.
Это поведение можно поменять с помощью нового свойства инициализации check_cn_status.
На сколько увеличилась производительность провайдера пока не знаю — потом тесты покажут.
А вот глумление над клиентом FB теперь приводит к ожидаемым тормозам.
Исходный код теста:
call exec("fb.direct","lazy_send") call exec("fb.direct","rpc") call exec("fb","") sub exec(dbclientType,protocolType) wscript.echo "------------------ ["&dbclientType&"]["&protocolType&"]" 'MsgBox "Stop!" dim cn set cn=createobject("ADODB.Connection") cn.Provider="LCPI.IBProvider.3" cn.Properties("OLE DB Services").value=0 cn.Properties("location").value="localhost:d:\database\employee.fdb" cn.Properties("user id").value="SYSDBA" cn.Properties("password").value="masterkey" cn.Properties("dbclient_type").value=dbclientType cn.Properties("remote:protocol_type").value=protocolType dim startTime startTime=Now() wscript.Echo "["&startTime&"] Start" call cn.Open("OLE DB Services=0") wscript.Echo "" wscript.echo cn.Properties("DBMS Name").Value&" ["&cn.Properties("DBMS Version").Value&"]" wscript.echo cn.Properties("Provider Name").Value&" ["&cn.Properties("Provider Version").Value&"]" wscript.Echo "" call cn.BeginTrans() dim cmd set cmd=createobject("ADODB.Command") cmd.ActiveConnection=cn cmd.CommandText="select * from employee" dim i dim rs wscript.Echo "["&Now()&"] Run Executes" for i=0 to 64999 set rs=cmd.Execute() call rs.Close() set rs=nothing next 'i wscript.Echo "["&Now()&"] Commit" call cn.CommitTrans() set cn=nothing dim stopTime stopTime=Now() wscript.Echo "["&stopTime&"] Stop" wscript.Echo "" wscript.Echo "Duration: "&DateDiff("s",startTime,stopTime)&" sec(s)" wscript.Echo "" end sub
Вывод:
------------------ [fb.direct][lazy_send] [02.08.2016 12:40:24] Start Firebird [2.5.6.26993] _IBProvider_v3_vc12xp_w64_trial_i.dll [3.31.0.21347] [02.08.2016 12:40:25] Run Executes [02.08.2016 12:40:34] Commit [02.08.2016 12:40:34] Stop Duration: 10 sec(s) ------------------ [fb.direct][rpc] [02.08.2016 12:40:34] Start Firebird [2.5.6.26993] _IBProvider_v3_vc12xp_w64_trial_i.dll [3.31.0.21347] [02.08.2016 12:40:35] Run Executes [02.08.2016 12:40:49] Commit [02.08.2016 12:40:49] Stop Duration: 15 sec(s) ------------------ [fb][] [02.08.2016 12:40:49] Start Firebird [2.5.6.26993] _IBProvider_v3_vc12xp_w64_trial_i.dll [3.31.0.21347] [02.08.2016 12:40:49] Run Executes [02.08.2016 12:41:31] Commit [02.08.2016 13:00:06] Stop Duration: 1157 sec(s)
Для разнообразия, сначала тестируется встроенный клиент для FB и два типа протокола (lazy_send, rpc). Потом — fbclient.dll.