F # - FSharp.Data.SqlClient - Как указать время ожидания для обновления - PullRequest
0 голосов
/ 09 января 2019

Я использую провайдеров типа 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 Ответ

0 голосов
/ 11 января 2019

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

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

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

type AddRow = SqlCommandProvider<"path to the parameterized INSERT statement", designTimeConnection> 
..............................
(new AddRow(runTimeConnection, commandTimeOut=timespan)).Execute(...arg=value...) |> ignore
...