F# - FSharp.Data.SqlClient - Как указать время ожидания для обновления

Я использую FSharp.Data.SqlClient введите провайдеров для доступа к базе данных сервера SQL. Итак, я настроил типы в F# следующим образом:

type ClmDB = SqlProgrammabilityProvider<ClmSqlProviderName, ConfigFile = AppConfigFile>
type ResultDataTable = ClmDB.dbo.Tables.ResultData
type ResultDataTableRow = ResultDataTable.Row

а потом я использую что-то вроде этого:

let saveResultData (r : ResultData) (conn : SqlConnection) =
    let t = new ResultDataTable()
    let newRow = r.addRow t
    t.Update(conn) |> ignore
    newRow.resultDataId

где ResultData это некоторый тип, который "знает", как преобразовать себя в строку ResultDataTable (ResultDataTableRow). Расширение r.addRow t делает это

Все отлично, за исключением того, что строка, которую я вставляю, может быть довольно большой (25-30 МБ), и поэтому у меня плохое предчувствие, что t.Update(conn) может произойти случайный тайм-аут, особенно из-за почти 100% загрузки процессора (ядро вычислительной системы рассчитано на потребление всех ресурсов обработки, хотя и с низким приоритетом). Зависший над t.Update не показывает способ указать время ожидания, и любое время ожидания на уровне соединения связано, ну, в общем, с соединением, а не с транзакцией вставки ☹.

Итак, вопрос заключается в том, как указать время ожидания для Update сделка.

Большое спасибо!

20190116 обновление - пока t.Update(conn) выше на моем компьютере работает без таймаутов при вставке строк данных размером 95 МБ при 100% ниже обычной загрузки некоторых других выполняющихся там вещей. Я еще не измерил фактическое время для таких транзакций. Если я это сделаю, то я буду обновлять это.

1 ответ

Решение

Вы не можете указать время ожидания для Update метод предоставленного DataTable потому что текущая реализация провайдера типов не обеспечивает такую ​​функцию.

Однако, как отмечается в документации, у вас может быть несколько вариантов настройки поведения по умолчанию.

Кроме того, поскольку ваш вариант использования напоминает вставку одной строки в таблицу, я бы придерживался реализации с помощью SqlCommandProvider используя его конструктор commandTimeOut необязательный параметр для установки желаемого значения времени ожидания timespan, как во фрагменте ниже:

type AddRow = SqlCommandProvider<"path to the parameterized INSERT statement", designTimeConnection> 
..............................
(new AddRow(runTimeConnection, commandTimeOut=timespan)).Execute(...arg=value...) |> ignore
Другие вопросы по тегам