Триал 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.

Leave a Comment